匹配任意路径或空字符串,无需添加多个 Flask 路由装饰器

Jes*_*ose 6 python werkzeug flask

我想捕捉与前缀开头的所有URL /stuff,这样下面的例子匹配:/users/users/,和/users/604511/edit。目前我编写了多个规则来匹配所有内容。有没有办法编写一个规则来匹配我想要的?

@blueprint.route('/users')
@blueprint.route('/users/')
@blueprint.route('/users/<path:path>')
def users(path=None):
    return str(path)
Run Code Online (Sandbox Code Playgroud)

dav*_*ism 10

将多个规则分配给同一个端点是合理的。这是最直接的解决方案。


如果您想要一个规则,您可以编写一个自定义转换器来捕获空字符串或以斜杠开头的任意数据。

from flask import Flask
from werkzeug.routing import BaseConverter

class WildcardConverter(BaseConverter):
    regex = r'(|/.*?)'
    weight = 200

app = Flask(__name__)
app.url_map.converters['wildcard'] = WildcardConverter

@app.route('/users<wildcard:path>')
def users(path):
    return path

c = app.test_client()
print(c.get('/users').data)  # b''
print(c.get('/users-no-prefix').data)  # (404 NOT FOUND)
print(c.get('/users/').data)  # b'/'
print(c.get('/users/400617/edit').data)  # b'/400617/edit'
Run Code Online (Sandbox Code Playgroud)

例如,如果您确实想匹配任何/users为前缀的内容,/users-no-slash/test请将规则更改为更加宽松:regex = r'.*?'