web-dev-qa-db-ja.com

flaskでg.user globalを使用する方法

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'

それ以外の場合、ログインは正常に機能します。私は何が欠けていますか?

55
Mittenchops

gスレッドローカル であり、リクエストごとです( プロキシに関する注意 を参照)。 sessionalsoスレッドローカルですが、デフォルトのコンテキストではMAC署名付きCookieに保持され、クライアントに送信されます。

実行中の問題は、sessionがリクエストごとに再構築されることです(クライアントに送信され、クライアントから送信されるため)。ただし、gに設定されたデータはthisリクエストのライフタイム。

simplestすべきこと(注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
75
Sean Vieira
11
AlexLordThorsen