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

2024-04-12

我的应用程序在 App Engine 上运行并使用Werkzeug http://werkzeug.pocoo.org/ and Jinja2 http://jinja.pocoo.org/2/。我想要一个功能上与 Django 自己的上下文处理器等效的东西:一个可调用的函数,它接受请求并向模板上下文添加一些内容。我已经有一个“上下文处理器”,可以向模板上下文添加一些内容,但是我如何获得它request部分工作?我将上下文处理器实现为可调用函数,它仅返回稍后用于更新上下文的字典。

例如,我想添加包含在request.environ.


实现这一目标的一种方法是通过后期绑定模板全局变量 http://jinja.pocoo.org/2/documentation/api#jinja2.Environment.globals使用线程本地代理 http://werkzeug.pocoo.org/documentation/local在韦克泽格。

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

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”。当然,这可能是环境中的其他任何东西。技巧是使用本地代理,然后在渲染任何模板之前设置该值。

我可能还应该补充一个像这样的框架格拉沙默 http://glashammer.org(Werkzeug+Jinja2) 通过使用事件为您简化此过程。许多函数可以在 WSGI 调用过程中(例如,创建请求时)连接到事件,并且此时它们可以将内容放入模板命名空间中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Werkzeug 和 Jinja2 的上下文处理器 的相关文章

随机推荐