我应用程序上运行的应用程序的发动机和实施使用 Jinja2.我想要有一些功能上相当于它自己的背景下处理:一个可调用的,需要一个请求,并增加了一些模板的上下文。我已经有一个"下处理",增加一些模板的方面,但是我怎么得到这个 请求 部分工作?我实施方面处理作为可调用类型,刚刚返回的字典,后来被用来更新范畴。

例如,我想添加的东西是包含在 request.environ.

有帮助吗?

解决方案

实现这一点的一种方式是通过后期绑定模板全局使用href="http://werkzeug.pocoo.org/documentation/local"在WERKZEUG rel="nofollow noreferrer">线程局部代理中

一个简单示例,所述请求到所述模板全局:

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)

现在您在任何模板,当前请求会出现绑定到变量“请求”。当然,这可能是ENVIRON别的东西。诀窍是使用本地代理,然后将该值设置你提供任何模板之前。

我也许应该补充一点,如 Glashammer (WERKZEUG + Jinja2的)框架简化了这一过程,您通过事件。许多功能可在WSGI呼叫(例如,创建了一个请求时)的过程中连接到该事件,它们可以在该点把东西在模板的命名空间。

其他提示

那么,使用什么阿里写道我来特定于应用程序引擎(因为它的进口缓存)的解决方案。不幸的是,阿里的代码不使用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)

这是应用程序引擎特定。在其他环境中阿里的代码按预期工作(这就是为什么我重新标记我的问题)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top