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

后端 未结 1 690
[愿得一人]
[愿得一人] 2020-12-20 21:32

I want to capture all urls beginning with the prefix /stuff, so that the following examples match: /users, /users/, and /users/6

相关标签:
1条回答
  • 2020-12-20 22:23

    It's reasonable to assign multiple rules to the same endpoint. That's the most straightforward solution.


    If you want one rule, you can write a custom converter to capture either the empty string or arbitrary data beginning with a slash.

    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'
    

    If you actually want to match anything prefixed with /users, for example /users-no-slash/test, change the rule to be more permissive: regex = r'.*?'.

    0 讨论(0)
提交回复
热议问题