web-dev-qa-db-ja.com

フラスコログインで現在のユーザーを追跡する方法は?

フラスコログインからの私のビューで現在のユーザーを使用しようとしています。だから私はg object

flask.ext.login.current_user to gオブジェクト

@pot.before_request
def load_users():
   g.user = current_user.username

ユーザーが正しい場合に機能します。しかし、sign-upを行うか、間違った資格情報でログインすると、このエラーが発生します

AttributeError: 'AnonymousUserMixin' object has no attribute 'username'

どこが間違っているのか教えてください...

17
naga4ce

@Joeと@pjnolaの回答に感謝します。皆さんが提案したとおり、 flask-login docs

匿名ユーザークラスをカスタマイズできることがわかったので、要件に合わせてカスタマイズしました。

Anonymous class

#!/usr/bin/python
#flask-login anonymous user class
from flask.ext.login import AnonymousUserMixin
class Anonymous(AnonymousUserMixin):
  def __init__(self):
    self.username = 'Guest'

次に、このクラスをanonymous_userに追加しました

login_manager.anonymous_user = Anonymous

これから、匿名リクエストの場合、ユーザー名を取得できました。

16
naga4ce

さて、エラーメッセージはそれをすべて言います。ログインしているユーザーはいないため、current_userAnonymousUserMixinを返します。 AnonymousUserMixinは、ここで説明するインターフェイスを実装します。 http://flask-login.readthedocs.org/en/latest/#your-user-classusernameプロパティ)。次のようなものを試してください:

@pot.before_request
def load_users():
    if current_user.is_authenticated():
        g.user = current_user.get_id() # return username in get_id()
    else:
        g.user = None # or 'some fake value', whatever

明らかに、あなたのコードの残りはg.userは実際のユーザーを指しません。

9
pjnola

AnonymousUserMixinにはユーザー名属性がありません。オブジェクトを上書きして、ミックスインを呼び出す必要があります。 LoginManager.anonymous_userを見てください。これは、ユーザーがログインしていないときに使用されるオブジェクトです。

また、どこかからユーザーを取得する必要があります。 current_user.usernameを使用するだけなので、gにユーザー名を保存しても意味がありません。

ユーザー名を取得したい場合も必要になります

if current_user.is_authenticated():
    g.user = current_user.username

これには、ユーザーオブジェクトにusernameというプロパティが必要です。 Flask-Loginsの使用をカスタマイズする方法はたくさんあります

ドキュメントを読み直して、ソースコードを確認することをお勧めします。

https://github.com/maxcountryman/flask-login/blob/master/flask_login.py

ジョー

5
Joe Doherty