背景下处理器的使用,并Jinja2
-
22-08-2019 - |
解决方案
实现这一点的一种方式是通过后期绑定模板全局使用href="http://werkzeug.pocoo.org/documentation/local"在WERKZEUG rel="nofollow noreferrer">线程局部代理中
一个简单示例,所述请求到所述模板全局: 现在您在任何模板,当前请求会出现绑定到变量“请求”。当然,这可能是ENVIRON别的东西。诀窍是使用本地代理,然后将该值设置你提供任何模板之前。 我也许应该补充一点,如 Glashammer (WERKZEUG + Jinja2的)框架简化了这一过程,您通过事件。许多功能可在WSGI呼叫(例如,创建了一个请求时)的过程中连接到该事件,它们可以在该点把东西在模板的命名空间。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)
其他提示
那么,使用什么阿里写道我来特定于应用程序引擎(因为它的进口缓存)的解决方案。不幸的是,阿里的代码不使用App Engine,因为那台神社全局进口只有一次的代码(使全局有效静态)。
我不得不写我自己的render()
功能和更新的背景下出现。为了完整起见,下面是我来的代码:
def render(template, **kwargs):
response_code = kwargs.pop('response_code', 200)
mimetype = kwargs.pop('mimetype', 'text/html')
for item in getattr(settings, 'CONTEXT_PROCESSORS', []):
try:
processor = import_string(item)
kwargs.update(processor(local.request))
except (ImportError, AttributeError), e:
logging.error(e)
return Response(jinja_env.get_template(template).render(**kwargs),
status=response_code, mimetype=mimetype)
这是应用程序引擎特定。在其他环境中阿里的代码按预期工作(这就是为什么我重新标记我的问题)。