2011-05-03 11 views

cevap

158

Custom Converter Flask'taki regex eşleştiricisi, 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 ile dönmelidir: http://localhost:5000/abc0-foo/

bu URL ile dönecektir gereken 404: http://localhost:5000/abcd-foo/

+6

+ 1 ne anlama geldiğini anlamıyorum! –

+4

Fakat bu normal ifadelerin derlendiği veya anında değerlendirildiği anlamına mı geliyor? –

+1

Bu regex doğrudan çalışma zamanında değerlendirilecek gibi görünüyor. Bu, regex desenlerinin son çiftinin bellekte derlendiği için daha küçük uygulamalar (veya regex'in birçok kez yeniden kullanan uygulamalar) için sorun teşkil etmemelidir. – bbenne10

47

Sen keyfi ifadeleri eşleşen özel konvertörlerindeki kanca: Armin ben bir uygulamaya nasıl kısaltılmış örneğini göstermek istedim kabul edilen bir cevapla beni dövdükleri rağmen

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

Kullanışlı bir örnek eklemek için 'to_python'un – corvid

14

Ayrıca bir catch rotanın tüm tip yazmak ve yöntemi 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 istekle eşleşecektir. Daha fazla bilgiyi burada bulabilirsiniz: Catch-All URL.

+0

teşekkürler, gerçekten yollarla işlevselliğe ihtiyacım vardı – user565447