在 jinja2 中访问会话变量或在 jinja2 webapp2 中设置全局变量 python
Access session variable in jinja2 or set global variable in jinja2 webapp2 python
我正在开发一个 webapp2 python 项目。有什么方法可以访问 jinja2 模板中的会话变量。我知道我们可以获取会话变量,然后将其传递给模板,然后我们就可以使用它了。但是我有很多处理程序,我不想每次都将会话变量传递给渲染函数。我正在寻找类似我们可以在 php 访问模板中的直接会话值中做的事情。任何帮助将不胜感激。
对于带有 Jinja2 的 webapp2,您可能需要使用 webapp2_extras.jinja2.default_config
并传入额外的全局变量。我认为这是正确的语法:
webapp2_extras.jinja2.default_config = {
"globals": {
"session": session
}
}
然后在模板中,您将像这样访问会话变量(假设您设置了 "username" 值):
<p>Welcome {{ session['username'] }}!</p>
注意:如果您使用使用 Jinja2 作为模板引擎的 Flask,会话变量将作为 standard context 的一部分传递给模板。
或者使用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)
我正在开发一个 webapp2 python 项目。有什么方法可以访问 jinja2 模板中的会话变量。我知道我们可以获取会话变量,然后将其传递给模板,然后我们就可以使用它了。但是我有很多处理程序,我不想每次都将会话变量传递给渲染函数。我正在寻找类似我们可以在 php 访问模板中的直接会话值中做的事情。任何帮助将不胜感激。
对于带有 Jinja2 的 webapp2,您可能需要使用 webapp2_extras.jinja2.default_config
并传入额外的全局变量。我认为这是正确的语法:
webapp2_extras.jinja2.default_config = {
"globals": {
"session": session
}
}
然后在模板中,您将像这样访问会话变量(假设您设置了 "username" 值):
<p>Welcome {{ session['username'] }}!</p>
注意:如果您使用使用 Jinja2 作为模板引擎的 Flask,会话变量将作为 standard context 的一部分传递给模板。
或者使用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)