0

私はdjangoを使用しており、電子メール検証機能を備えているため、誰かが電子メールを検証すると、ステータスを設定してアカウントをアクティブにします。誰かが他の誰かの電子メールアドレスを使用すると、彼は確認できず、それでログインできなくなります. したがって、このステータスフィールドはdjango認証アプリのテーブルにあるため、ログイン中にdjangoがユーザーのステータスも確認することを期待していました。ログイン中に、django はユーザー名 param のみでログインを試みます。したがって、ログインすると次のように表示されます。

MultipleObjectsReturned at /accounts/login/
 get() returned more than one User -- it returned 2! Lookup parameters were {'username': u'kaasib122@gmail.com'}

ルックアップにもステータスフィールドを追加する方法はありますか? そのための設定がありますか、それとも何らかのログインバックエンドを書く必要がありますか? または、ログイン テーブルの独自のビューを別の方法で作成する必要がありますか? おすすめの方法は?また、ユーザーがユーザー名フィールドにメールまたはユーザー名を使用してログインできるようにすることも考えています。では、おすすめの方法とは?

4

1 に答える 1

1

ニーズに合った認証バックエンドを作成する必要があります。django のドキュメントを参照してください。

基本的に、フィルター パラメーターで「ステータス」を使用する「認証」メソッドを記述する必要があります。電子メールまたはユーザー名を使用する場合、基本的に 1 つのフィールド (ユーザー名または電子メール) でフィルター処理を行い、そのフィールドに対してユーザー オブジェクトが返されない場合は、もう一方のフィールドでフィルター処理を行うことができます。または、これらのフィールドを OR することにより、単一のフィルターでユーザーを取得できます。擬似コードは次のとおりです。

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User

class AuthenticationBackend(ModelBackend):
    def authenticate(self, username=None, password=None):
        try:
            user = User.objects.get(email=username, status=True)
        except User.DoesNotExist:
            try:
                user = User.objects.get(username=username, status=True)
            except User.DoesNotExist:
                return None
        # check password too
        if user.check_password(password):
            return user
        return None

新しい認証バックエンドを作成するときは、それを使用するために settings.py の AUTHENTICATION_BACKENDS パラメータに追加する必要があることに注意してください。カスタマイズしたために Django が提供するデフォルトのものを必要としない場合は、そのパラメーターをオーバーライドするだけで、タプルに追加する必要はありません。

于 2012-09-20T06:42:51.260 に答える