¿Cómo evitar la duplicación del procedimiento de configuración de contexto cuando se utiliza una plantilla base?

Cuando se utiliza jinja2 , la plantilla de “esqueleto” base a menudo se extiende por muchas otras plantillas.

Una de mis plantillas base requiere ciertas variables en el contexto, y en todos los lugares donde uso esta plantilla tengo que duplicar el procedimiento de configuración.

Por ejemplo, es posible que tenga que leer algunos nombres de categorías de la base de datos y mostrarlos como una lista en el encabezado, ahora tengo que escribir esta consulta en todas partes donde uso la plantilla base.

¿Cuál es una buena manera de evitar la duplicación de este tipo de código al usar jinja2 ?

Puede agregar procesadores de contexto a su aplicación o plano. Estos inyectan valores extra en el contexto de Jinja. Estas no forman parte de ninguna vista, pero se ejecutarán en el contexto de la solicitud, por lo que tendrá acceso a todo lo que normalmente tendría en una vista.

 @app.context_processor def base_context(): return { 'author': 'davidism', 'last_update': interesting_function() 'headers': db.query(MyModel.category).distinct().all() } 

Los procesadores agregados en un plano solo están disponibles para las plantillas representadas desde una vista en ese plano.

El contexto pasado a las funciones render_template anulará estos valores de contexto predeterminados (si tienen la misma clave).

Una forma en la que puedo pensar es usar un decorador que proporcione variables de contexto adicionales al resultado de cada vista.

Puedes usar macros en Jinja2 o filtros personalizados:

Macros

http://jinja.pocoo.org/docs/dev/templates/#macros

Puedes registrar tus filtros personalizados con decoradores como este:

https://github.com/dpgaspar/Flask-AppBuilder/blob/master/flask_appbuilder/filters.py