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'
それ以外の場合、ログインは正常に機能します。私は何が欠けていますか?
g
は スレッドローカル であり、リクエストごとです( プロキシに関する注意 を参照)。 session
はalsoスレッドローカルですが、デフォルトのコンテキストでは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
軽微な修正。gオブジェクトは、リクエストコンテキストではなくアプリケーションコンテキストにバインドされるようになりました。