代码之家  ›  专栏  ›  技术社区  ›  zgoda

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

  •  4
  • zgoda  · 技术社区  · 17 年前

    我的应用程序在App Engine上运行,并使用 Werkzeug Jinja2 . 我希望在功能上与Django自己的上下文处理器相当:一个接受请求并向模板上下文添加内容的可调用处理器。我已经有了一个“上下文处理器”,可以在模板上下文中添加一些内容,但是我该如何得到它呢 要求

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

    2 回复  |  直到 15 年前
        1
  •  4
  •   Peter Mortensen Pieter Jan Bonestroo    15 年前

    实现这一点的一种方法是通过延迟绑定 template globals 使用 thread-local proxy

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

    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调用过程中(例如,当创建请求时)连接到事件,并且可以在此时将内容放入模板名称空间。

        2
  •  3
  •   Community Mohan Dere    9 年前

    嗯,使用 what Ali wrote

    我必须自己写 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)
    

    这是特定于应用程序引擎的。在其他环境中,Ali的代码按预期工作(这就是我重新标记问题的原因)。