匹配任意路径或空字符串,无需添加多个 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'.*?'
.
我想捕获所有以前缀 /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'.*?'
.