据我所了解的Flask中的g变量,它应该为我提供一个存放数据的全局位置,例如在登录后保留当前用户。这是正确的吗?
登录后,我希望我的导航在整个网站上显示我的用户名。
我的视图包含
from Flask import g #among other things
在登录期间,我分配
user = User.query.filter_by(username = form.username.data).first()
if validate(user):
session['logged_in'] = True
g.user = user
看来我无法访问g.user。相反,当我的base.html模板具有以下内容时...
<ul class="nav">
{% if session['logged_in'] %}
<li class="inactive">logged in as {{ g.user.username }}</li>
{% endif %}
</ul>
我收到错误:
jinja2.exceptions.UndefinedError
UndefinedError: 'flask.ctx._RequestGlobals object' has no attribute 'user'
否则,该登录正常。我想念什么?
thisg
是thread local,并且是每个请求的值(请参见A Note On Proxies)。 session
是本地线程,但默认情况下将其持久保存到MAC签名的cookie并发送给客户端。您遇到的问题是session
在每个请求上都会重建(因为它已发送到客户端,并且客户端将它发送回给我们),而g
上设置的数据仅在整个生命周期内都可用的
simple != secure
-如果需要安全,请看一下Flask-Login)是将用户的ID添加到会话中,并在每个请求上加载用户:@app.before_request
def load_user():
if session["user_id"]:
user = User.query.filter_by(username=session["user_id"]).first()
else:
user = {"name": "Guest"} # Make it better, use an anonymous User instead
g.user = user