路由定义
除了使用Starlette
类中提供的add_route()
函数来定义路由,Starlette还提供了Router
类来定义路由。使用Router
类定义的路由可以替代Starlette
类实例来启动Starlette应用,并直接提供路由访问功能。
Router
类定义的路由需要使用Route
类和Mount
类配合。以下给出一个示例。
from starlette.routing import Mount, Route, Router
# 从项目的其他模块中引入Home类和SubApp实例等。
app = Router([
Route('/', endpoint=Home, methods=['GET']),
Route('/users/{username}', endpoint=User, methods=['GET']),
Route('/users/{user_id:int}', endpoint=User, methods=['GET']),
Mount('/mount', app=SubApp),
Mount('/sub', app=Router([
Route('/', endpoint=SubHome, methods=['GET', 'POST'])
]))
])
上面的示例已经展示了Router
类的使用。其中包括如何在路由路径中使用参数,以及定义参数的类型。具体如何在Endpoint中捕获这些定义的参数,将在后面Endpoint一节中介绍。在使用路由参数时,需要注意路由路径的定义顺序,带有参数的路由应当在同样前缀的路由组中尽量靠后放置,例如有两个路由:\user\self
和路由\user\{username}
,其定义顺序就十分重要,如果带有参数的路由路径先定义,那么\user\self
就永远不会有任何响应,因为它不能捕获到任何访问。
这里需要牢记的是Route
类用于定义一个路由处理器,Mount
类用于加载一套子路由。