路由#

Quart 允许定义多个和复杂的路由,允许客户端根据请求的方法和路径触发特定的代码。

最简单的路由是简单的静态规则,例如以下内容,

@app.route('/')
async def index():
    ...

@app.route('/about')
async def about():
    ...

这通常足以用于大多数静态网站。

动态路由#

动态路由可以通过使用 <variable> 标记来实现,这些标记指定路由的一部分可以匹配而不是预定义。例如,

@app.route('/page/<page_no>')
async def page(page_no):
    ...

将匹配路径 /page/1/page/2/page/jeff,并将 page_no 参数分别设置为 '1''2''jeff'

转换器#

通常有必要且有用地指定变量应该如何转换以及由此产生的路径匹配。这是通过在变量名称之前添加转换器名称,并用冒号分隔来实现的,<converter:variable>。调整上面的示例,

@app.route('/page/<int:page_no>')
async def page(page_no):
    ...

将匹配路径 /page/1/page/2,并将 page_no 参数分别设置为 12(注意类型),但不再匹配 /page/jeff,因为 jeff 无法转换为 int。

可用的转换器有:

float

正浮点数

int

正整数

path

类似于 string,包含斜杠

string

(默认)任何不包含斜杠的文本

uuid

UUID 字符串

注意,可以将额外的转换器添加到 url_map converters 字典中。

通配路由#

一个 /<path:path> 路由定义将捕获所有与其他任何路由不匹配的请求。

默认值#

变量使用有时会让用户感到恼火,例如 /page/<int:page_no> 不会匹配 /page,迫使用户指定 /page/1。这可以通过指定一个默认值来解决,

@app.route('/page', defaults={'page_no': 1})
@app.route('/page/<int:page_no>')
async def page(page_no):
    ...

这允许 /pagepage_no 设置为 1 匹配。

主机匹配、主机和子域名#

如果应用程序启用了主机匹配,则可以将路由显式添加 hostsubdomain 来进行匹配。这会导致路由仅在主机标头匹配时匹配,例如 host='quart.com' 将允许路由匹配任何主机标头为 quart.com 的请求,否则将返回 404。

subdomain 选项仅在应用程序配置 SERVER_NAME 设置时才可以使用,因为主机将被构建为 {subdomain}.{SERVER_NAME}

请注意,变量转换器可以在主机或子域名选项中使用。

另请参见#

Quart 使用 Werkzeug 的路由器