Respuestas:
Aunque Armin se me adelantó con una respuesta aceptada, pensé en mostrar un ejemplo abreviado de cómo implementé un comparador de expresiones regulares en Flask en caso de que alguien quiera un ejemplo práctico de cómo se podría hacer esto.
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)
esta URL debe regresar con 200: http: // localhost: 5000 / abc0-foo /
esta URL debería volver con 404: http: // localhost: 5000 / abcd-foo /
self.regex
, pero ¿dónde ocurre la coincidencia?
Puede conectar convertidores personalizados que coincidan con expresiones arbitrarias: Convertidor 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
hace
También puede escribir una captura de todo tipo de ruta y hacer enrutamiento complejo dentro del 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()
Esto coincidirá con cualquier solicitud. Vea más detalles aquí: Catch-All URL .