Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
634 views
in Technique[技术] by (71.8m points)

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

I want to capture all urls beginning with the prefix /stuff, so that the following examples match: /users, /users/, and /users/604511/edit. Currently I write multiple rules to match everything. Is there a way to write one rule to match what I want?

@blueprint.route('/users')
@blueprint.route('/users/')
@blueprint.route('/users/<path:path>')
def users(path=None):
    return str(path)
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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'.*?'.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...