Câu trả lời:
Mặc dù Armin đã đánh bại tôi với một câu trả lời được chấp nhận, tôi nghĩ rằng tôi sẽ hiển thị một ví dụ viết tắt về cách tôi triển khai một trình đối sánh regex trong Flask chỉ trong trường hợp bất kỳ ai muốn một ví dụ làm việc về cách điều này có thể được thực hiện.
from flask import Flask
from werkzeug.routing import BaseConverter
app = Flask(__name__)
class RegexConverter(BaseConverter):
def __init__(self, url_map, *items):
super(RegexConverter, self).__init__(url_map)
self.regex = items[0]
app.url_map.converters['regex'] = RegexConverter
@app.route('/<regex("[abcABC0-9]{4,6}"):uid>-<slug>/')
def example(uid, slug):
return "uid: %s, slug: %s" % (uid, slug)
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000)
URL này phải trả về 200: http: // localhost: 5000 / abc0-foo /
URL này sẽ trả về 404: http: // localhost: 5000 / abcd-foo /
self.regex
, nhưng khớp sẽ xảy ra ở đâu?
Bạn có thể treo trong bộ chuyển đổi tùy chỉnh phù hợp cho các biểu thức tùy ý: Tuỳ chỉnh chuyển đổi
from random import randrange
from werkzeug.routing import Rule, Map, BaseConverter, ValidationError
class BooleanConverter(BaseConverter):
def __init__(self, url_map, randomify=False):
super(BooleanConverter, self).__init__(url_map)
self.randomify = randomify
self.regex = '(?:yes|no|maybe)'
def to_python(self, value):
if value == 'maybe':
if self.randomify:
return not randrange(2)
raise ValidationError()
return value == 'yes'
def to_url(self, value):
return value and 'yes' or 'no'
url_map = Map([
Rule('/vote/<bool:werkzeug_rocks>', endpoint='vote'),
Rule('/vote/<bool(randomify=True):foo>', endpoint='foo')
], converters={'bool': BooleanConverter})
to_python
xảy ra
Bạn cũng có thể viết một bắt tất cả các loại tuyến đường và thực hiện định tuyến phức tạp trong phương thức:
from flask import Flask
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'], defaults={'path': ''})
@app.route('/<path:path>', methods=['GET', 'POST'])
def catch_all(path):
return 'You want path: %s' % path
if __name__ == '__main__':
app.run()
Điều này sẽ phù hợp với bất kỳ yêu cầu nào. Xem thêm chi tiết tại đây: URL Catch-All .