Одним из способов достижения этого является использование глобальных шаблонов с поздним связыванием с использованием локального прокси-потока в Werkzeug.
Простой пример, который помещает запрос в глобальные переменные шаблона:
from werkzeug import Local, LocalManager
local = Local()
local_manager = LocalManager([local])
from jinja2 import Environment, FileSystemLoader
# Create a global dict using the local's proxy to the request attribute
global_dict = {'request': local('request')}
jinja2_env = Environment(loader=FileSystemLoader('/'))
jinja2_env.globals.update(global_dict)
def application(environ, start_response):
"""A WSGI Application"""
# later, bind the actual attribute to the local object
local.request = request = Request(environ)
# continue to view handling code
# ...
application = local_manager.make_middleware(application)
Теперь в любом из ваших шаблонов текущий запрос будет связан с переменной «запрос». Конечно, это может быть что-то еще в окружающей среде. Хитрость заключается в том, чтобы использовать локальный прокси-сервер, а затем установить значение, прежде чем создавать какой-либо шаблон.
Вероятно, мне следует добавить, что фреймворк, такой как Glashammer (Werkzeug + Jinja2), упрощает этот процесс для вас, используя события. Многие функции могут подключаться к событиям во время процесса вызова WSGI (например, при создании запроса), и они могут помещать вещи в пространство имен шаблона в этот момент.