python – 使用Werkzeug和Jinja2的上下文处理器

我的应用程序在App Engine上运行,并使用WerkzeugJinja2实现.我想在功能上等同于Django自己的上下文处理器:一个可调用的请求并向模板上下文添加内容.我已经有一个“上下文处理器”,它可以为模板上下文添加一些内容,但是如何让这个请求部分工作呢?我将上下文处理器实现为一个callable,它只返回一个字典,后来用于更新上下文.

例如,我想添加request.environ中包含的内容.

解决方法:

实现这一目标的一种方法是使用Werkzeug的thread-local proxy进行后期template globals.

将请求放入模板全局变量的简单示例:

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)

现在,在任何模板中,当前请求将显示绑定到变量“request”.当然,这可能是环境中的任何其他内容.诀窍是使用本地代理,然后在呈现任何模板之前设置值.

我还应该补充一点,像Glashammer(Werkzeug Jinja2)这样的框架通过使用事件简化了这个过程.许多函数可以在WSGI调用过程中连接到事件(例如,创建请求时),并且可以在此时将内容放入模板命名空间中.

上一篇:ForkJoin


下一篇:就凭这?GitHub star过万的1121页图解算法成功杀进字节跳动,Java架构师稳了~