Flask'ın int, float ve yol dönüştürücülere sahip olduğunu anlıyorum, ancak geliştirmekte olduğumuz uygulamanın URL'lerinde daha karmaşık modeller var.
Django'da olduğu gibi normal ifadeleri kullanmanın bir yolu var mı?
Yanıtlar:
Armin kabul edilen bir cevapla beni yumruk attıysa da, Flask'ta bir normal ifade eşleştiriciyi nasıl uyguladığıma dair kısaltılmış bir örnek göstereceğimi düşündüm, bunun nasıl yapılabileceğine dair çalışan bir örnek istemesi durumunda.
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)
bu URL 200: http: // localhost: 5000 / abc0-foo / ile dönmelidir
bu URL 404: http: // localhost: 5000 / abcd-foo / ile dönmelidir
self.regex, ancak eşleşme nerede oluyor?
İsteğe bağlı ifadelerle eşleşen özel dönüştürücüler bağlayabilirsiniz: Özel Dönüştürücü
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_pythonyok
Ayrıca her tür rotayı yakalama yazabilir ve yöntem içinde karmaşık yönlendirme yapabilirsiniz:
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()
Bu, herhangi bir taleple eşleşecektir. Daha fazla ayrıntıya buradan bakın: Tümünü Yakala URL'si .