Réponses:
Même si Armin m'a battu avec une réponse acceptée, j'ai pensé montrer un exemple abrégé de la façon dont j'ai implémenté un matcher regex dans Flask au cas où quelqu'un voudrait un exemple fonctionnel de la façon dont cela pourrait être fait.
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)
cette URL doit renvoyer avec 200: http: // localhost: 5000 / abc0-foo /
cette URL devrait renvoyer avec 404: http: // localhost: 5000 / abcd-foo /
self.regex
, mais où se produit la correspondance?
Vous pouvez accrocher des convertisseurs personnalisés qui correspondent à des expressions arbitraires: Convertisseur personnalisé
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
fait
Vous pouvez également écrire un type de route catch all et effectuer un routage complexe dans la méthode:
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()
Cela correspondra à toute demande. Pour en savoir plus, cliquez ici: URL attrape-tout .