路由定义

除了使用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类用于加载一套子路由。