105 votes

Fiole prend-il en charge les expressions régulières dans le routage d’URL ?

Je comprends que la fiole a l’int, float et chemin d’accès de convertisseurs, mais l’application que nous développons a des motifs plus complexes dans son URL.

Y a-t-il un moyen que nous pouvons utiliser des expressions régulières, comme Django ?

200voto

Philip Southam Points 4807

Même si Armin me battre pour le punch avec un accepté de répondre, j'ai pensé que je voudrais vous montrer un abrégé exemple de la façon dont j'ai mis en place une regex matcher en Flacon, juste au cas où quelqu'un veut un exemple 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 revenir avec 200: http://localhost:5000/abc0-foo/

cette URL sera de retour avec 404: http://localhost:5000/abcd-foo/

49voto

Armin Ronacher Points 16894

Vous pouvez le brancher dans des convertisseurs de match pour arbitraire expressions: Client Converter

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

17voto

Zorayr Points 2637

Vous pouvez également écrire un fourre-tout type de route et de faire le routage complexes à l'intérieur de 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 correspond à toute requête. Voir plus de détails ici: Fourre-Tout de l'URL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X