2017-10-12 121 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)