Mit*_*ops 56 python jinja2 flask flask-login
据我了解Flask中的g变量,它应该为我提供一个存储数据的全局位置,例如在登录后保存当前用户.它是否正确?
我希望我的导航在整个站点登录后显示我的用户名.
我的观点包含
from Flask import g #among other things
Run Code Online (Sandbox Code Playgroud)
在登录期间,我分配
user = User.query.filter_by(username = form.username.data).first()
if validate(user):
session['logged_in'] = True
g.user = user
Run Code Online (Sandbox Code Playgroud)
我似乎无法访问g.user.相反,当我的base.html模板具有以下内容时......
<ul class="nav">
{% if session['logged_in'] %}
<li class="inactive">logged in as {{ g.user.username }}</li>
{% endif %}
</ul>
Run Code Online (Sandbox Code Playgroud)
我收到错误:
jinja2.exceptions.UndefinedError
UndefinedError: 'flask.ctx._RequestGlobals object' has no attribute 'user'
Run Code Online (Sandbox Code Playgroud)
登录否则工作正常.我错过了什么?
Sea*_*ira 76
g是一个本地线程,是按请求(请参阅代理注释).该session是还一个线程局部,但在默认情况下被保存到一个MAC-签署cookie,并发送给客户端.
您遇到的问题session是在每个请求上重建(因为它被发送到客户端并且客户端将其发送回给我们),而设置的数据g仅在此请求的生命周期内可用.
在最简单的事情(注意simple != secure-如果你需要确保看看烧瓶登录)是简单地将用户的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
Run Code Online (Sandbox Code Playgroud)
Ale*_*sen 11
小修正,g对象现在绑定到应用程序上下文而不是请求上下文.
"从Flask 0.10开始,它存储在应用程序上下文中,不再存在于请求上下文中,这意味着只有应用程序上下文被绑定且尚未成为请求时它才可用."