2011-05-03 41 views

Respuesta

158

A pesar de que Armin me ganó de mano con una respuesta aceptada pensé que iba a presentar un ejemplo abreviado de cómo he implementado una Regex Matcher 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) 

este URL debe devolver con 200: http://localhost:5000/abc0-foo/

este URL debe volverá con 404: http://localhost:5000/abcd-foo/

+6

+1 para agregar un ejemplo útil! –

+4

Pero, ¿significa esto que las expresiones regulares se compilan o se evalúan sobre la marcha? –

+1

Parece que la expresión regular se evaluará directamente en el tiempo de ejecución. Esto no debería ser problemático para aplicaciones más pequeñas (o aplicaciones que reutilizan varias veces regex, creo) ya que los últimos patrones regex se almacenan compilados en la memoria. – bbenne10

47

Usted puede conectar en los convertidores personalizados que responden a las expresiones arbitrarias: Custom 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}) 
+0

No entiendo qué 'to_python' hace – corvid

14

También podría escribir una captura de todo tipo de ruta y hacer 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.

+0

gracias, realmente necesitaba la funcionalidad con rutas – user565447