Respostas:
Mesmo que Armin me supere com uma resposta aceita, pensei em mostrar um exemplo abreviado de como implementei um matcher regex no Flask, apenas no caso de alguém querer um exemplo prático de como isso poderia ser feito.
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)
este URL deve retornar com 200: http: // localhost: 5000 / abc0-foo /
este URL deve retornar com 404: http: // localhost: 5000 / abcd-foo /
self.regex
, mas onde a correspondência acontece?
Você pode conectar conversores personalizados que correspondem a expressões arbitrárias: Conversor personalizado
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
significa
Você também pode escrever uma captura de todos os tipos de rota e fazer roteamento complexo dentro do método:
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()
Isso vai corresponder a qualquer pedido. Veja mais detalhes aqui: URL pega-tudo .