send_file route create before_request app python flask jinja2

python - route - send_file flask



Crear argumentos dinĂ¡micos para url_for en Flask (2)

Tengo una plantilla jinja2 que reutilizo para diferentes rutas de Flask. Todas estas rutas tienen un solo parámetro requerido y manejan solo las solicitudes GET , pero algunas rutas pueden tener argumentos adicionales.

¿Hay alguna manera de agregar argumentos adicionales en url_for() ?

Algo como

url_for(my_custom_url, oid=oid, args=extra_args)

que se representará en (según el punto final de la ruta):

# route ''doit/<oid>'' with arguments doit/123?name=bob&age=45 # route ''other/<oid>'' without arguments other/123

Mi caso de uso sería proporcionar enlaces con argumentos de consulta predefinidos:

<a href=" {{ url_for(''doit'', oid=oid, args=extra_args }} ">A specific query</a> <a href=" {{ url_for(''other'', oid=oid) }} ">A generic query</a>

Me gustaría ejecutar esta plantilla sin JavaScript, por lo que no me gustaría asignar un escucha de clics y usar AJAX para hacer una solicitud GET para cada enlace si es posible.


Cualquier argumento que no coincida con los parámetros de ruta se agregará como la cadena de consulta. Suponiendo que extra_args es un dict, simplemente descomprímelo.

extra_args = {''hello'': ''world''} url_for(''doit'', oid=oid, **extra_args) # /doit/123?hello=world url_for(''doit'', oid=oid, hello=''davidism'') # /doit/123?hello=davidism

Luego acceda a ellos en la vista con request.args :

@app.route(''/doit/<int:oid>'') def doit(oid) hello = request.args.get(''hello'') ...


Usando su ejemplo, esta herida genera las URL como solicitó si conoce sus argumentos de antemano.

<a href=" {{ url_for(''doit'', oid=oid, name=''bob'', age=45 }} ">A specific query</a> <a href=" {{ url_for(''other'', oid=oid) }} ">A generic query</a>

La respuesta de @ davidism sería preferible si su conjunto de argumentos no se conoce hasta el tiempo de ejecución y se almacenan en un diccionario.