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

Match an arbitrary path, or the empty string, without adding multiple Flask route decorators

我想捕获所有以前缀 /stuff 开头的 url,以便匹配以下示例:/users/users//users/604511/edit。目前我编写了多个规则来匹配所有内容。有没有办法写一个规则来匹配我想要的?

@blueprint.route('/users')
@blueprint.route('/users/')
@blueprint.route('/users/<path:path>')
def users(path=None):
    return str(path)

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


如果你想要一个规则,你可以写一个custom converter来捕获空字符串或以斜杠开头的任意数据。

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'

如果你真的想匹配 任何前缀为 /users 的东西,例如 /users-no-slash/test,请将规则更改为更宽松:regex = r'.*?'.