simple organize python regex flask

python - organize - flask simple



¿Flask admite expresiones regulares en su enrutamiento de URL? (3)

Entiendo que Flask tiene los convertidores int, float y path, pero la aplicación que estamos desarrollando tiene patrones más complejos en sus URL.

¿Hay alguna manera de que podamos usar expresiones regulares, como en Django?


A pesar de que Armin me golpeó al golpe con una respuesta aceptada, pensé que mostraría un ejemplo abreviado de cómo implementé un matchere regex en Flask, por si acaso alguien quiere 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/


Puede enganchar 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})


También puede escribir un tipo de ruta catch all y hacer un 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 .