访问jinja2中的会话变量或在jinja2中设置全局变量webapp2 python

时间:2017-10-12 16:43:14

标签: python google-app-engine session jinja2 webapp2

我正在开发一个webapp2 python项目。有没有办法可以访问jinja2模板中的会话变量。我知道我们可以获取会话变量,然后将其传递给模板,然后我们就可以使用它。但我有很多处理程序,我不想每次都将会话变量传递给渲染函数。我正在寻找像我们可以在模板中访问php访问直接会话值的东西。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

对于带有Jinja2的webapp2,看起来您可能需要使用webapp2_extras.jinja2.default_config并传入其他全局变量。我认为这是正确的语法:

webapp2_extras.jinja2.default_config = {
  "globals": {
    "session": session
  }
}

然后在模板中,您将访问这样的会话变量(假设您设置了“用户名”值):

<p>Welcome {{ session['username'] }}!</p>

注意:如果您使用使用Jinja2作为模板引擎的Flask,会话变量将作为standard context的一部分传递给模板。

答案 1 :(得分:1)

或使用BaseHandler添加模板上下文:

class BaseHandler(webapp2.RequestHandler):
    """ webapp2 base handler """

    def __init__(self, request, response):

        self.session_store = None
        super(BaseHandler, self).__init__(request, response)
        user = users.get_current_user()
        # if not users.is_current_user_admin():
        if user.email() not in USER_CONFIG:
            self.abort(401)

    def dispatch(self):

        # Get a session store for this request.
        self.session_store = sessions.get_store(request=self.request)
        if not self.session:
            session_data_or_default(self.session)
        try:
            # Dispatch the request.
            webapp2.RequestHandler.dispatch(self)
        finally:
            self.session['route_name'] = self.request.route.name
            # Save all sessions.
            self.session_store.save_sessions(self.response)

    @webapp2.cached_property
    def session(self):
        # Returns a session using the default cookie key.
        # we use memcache because the amount of data you can store in a secure cookie is limited.
        return self.session_store.get_session(name='my-secret-session', backend='memcache')

    @webapp2.cached_property
    def jinja2(self):
        return jinja2.get_jinja2(app=self.app)

    def render_template(self, template, **template_args):
        template_args['session'] = self.session
        template_args['version'] = modules.get_current_version_name()

        self.response.write(self.jinja2.render_template(template, **template_args))

    def return_rendered(self, template, **template_args):
        template_args['session'] = self.session

        return self.jinja2.render_template(template, **template_args)