【问题标题】:Match an arbitrary path, or the empty string, without adding multiple Flask route decorators匹配任意路径或空字符串,无需添加多个 Flask 路由装饰器
【发布时间】:2023-03-07 13:40:02
【问题描述】:

我想捕获所有以前缀/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)

【问题讨论】:

    标签: python flask werkzeug


    【解决方案1】:

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


    如果你想要一个规则,你可以写一个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'.*?'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 2022-12-10
      • 2018-02-06
      相关资源
      最近更新 更多