Enrutamiento personalizado en la aplicación Flask

He estado tratando de entender cómo generar URLs dinámicas de matraz. He leído la documentación y varios ejemplos, pero no puedo entender por qué este código no funciona:

path = 'foo' @app.route('/', methods=['POST']) def index(path=None): # do some stuff... return flask.render_template('index.html', path=path) 

Espero que mi plantilla index.html se sirva a /foo , pero no lo es. Me sale un error de comstackción. ¿Qué me estoy perdiendo?

Si utilizo una ruta fija, como /bar , todo funciona sin problemas.

@app.route('/bar', methods=['POST'])

Ya tienes el largo y el corto de eso. Todo lo que necesita hacer es decorar sus funciones de vista usando la syntax / (o la syntax / cuando sea apropiado).

 from flask import Flask, render_template app = Flask(__name__) @app.route('/') def index(): return render_template('index.html') @app.route('/', defaults={'word': 'bird'}) def word_up(word): return render_template('whatstheword.html', word=word) @app.route('/files/') def serve_file(path): return send_from_directory(app.config['UPLOAD_DIR'], path, as_attachment=True) if __name__ == '__main__': app.debug = True app.run(port=9017) 

Cuando Flask saca una variable de una URL para una ruta dinámica como la que intentas usar, será una cadena Unicode en Python de forma predeterminada. Si crea la variable con los convertidores o , se convertirá al tipo apropiado en el espacio de la aplicación para usted.

El convertidor coincidirá en una cadena que contiene barras ( / ), por lo que puede pasar /blah/dee/blah y la variable de ruta en su función de vista contendrá esa cadena. Sin usar el convertidor de path , el matraz intentaría enviar su solicitud a una función de vista registrada en la ruta /blah/dee/blah , porque el llano está delimitado por el siguiente / en el uri.

Así que mirando mi pequeña aplicación, la /files/ serviría a cualquier archivo que pudiera encontrar que coincidiera con la ruta enviada por el usuario en la solicitud. Saqué este ejemplo de la documentación aquí .

Además, compruebe que puede especificar valores predeterminados para sus URL variables mediante una palabra clave arg al decorador route() .

Si lo desea, incluso puede acceder al url_map subyacente que Werkzeug construye según la forma en que especifique las funciones de vista y las rutas en el espacio de su aplicación. Para obtener más información, consulte la documentación de la API en los registros de URL.

Puedes usar add_url_rule() :

 def index(path=None): return render_template('index.html', path=path) path = '/foo' app.add_url_rule(path, 'index', index) 

También es posible que desee ver los objetos de planos si termina haciendo esto mucho.