一尘不染

如何在Flask中使用g.user global

flask

据我了解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'

否则登录正常。我想念什么?


阅读 1560

收藏
2020-04-05

共1个答案

一尘不染

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
2020-04-05