如何在烧瓶中使用g.user global

问题描述 投票:59回答:3

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

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

python flask jinja2 flask-login
3个回答
77
投票

gthread local,并且是每个请求的值(请参见A Note On Proxies)。 session是本地线程,但默认情况下将其持久保存到MAC签名的cookie并发送给客户端。您遇到的问题是session在每个请求上都会重建(因为它已发送到客户端,并且客户端将它发送回给我们),而g上设置的数据仅在整个生命周期内都可用的

this

请求。要做的[[最简单

(请注意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


12
投票

-18
投票
© www.soinside.com 2019 - 2024. All rights reserved.