据我了解在瓶中摹变量,它应该为我提供了一个全球性的地方藏匿像登录后保存当前用户数据。 它是否正确?
我想我的导航显示我的用户名,登录后,整个网站。
我的观点包含
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'
登录否则工作正常。 我在想什么?
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
次要校正时,克对象绑定到应用程序上下文现在代替的请求上下文。
“与瓶0.10开始,这是存储在应用程序上下文而不再这意味着如果只有应用程序上下文势必变得可用,还没有一个请求的请求范围内。”
我想尝试摆脱全局的一起,想你的应用程序作为一组执行任务,每个功能具有输入和输出功能,并且不应该触及全局。 就去拿你的用户,并通过它周围,它使你的代码更加可测试。 更妙的是:摆脱烧瓶,烧瓶促进使用全局变量如
from flask import request