2017-10-12 103 views
0

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

回答

3

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

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

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

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

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

+0

能否请你解释了一下我该如何使用呢? –

+0

新增使用示例 – BrettJ

+0

当我们在全局变量中使用它时,会话变量出现错误。 –

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)