【问题标题】:Access session variable in jinja2 or set global variable in jinja2 webapp2 python在 jinja2 中访问会话变量或在 jinja2 webapp2 python 中设置全局变量
【发布时间】:2018-03-24 16:50:50
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 你能解释一下我如何使用它吗?
    • 添加使用示例
    • 当我们在全局变量中使用会话变量时会出错。
    【解决方案2】:

    或者使用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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-09
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      • 2018-06-07
      • 2023-04-07
      • 2016-01-03
      • 1970-01-01
      相关资源
      最近更新 更多