कस्टम LoginSerializer में:

class LoginSerializer(serializers.Serializer):
    username = serializers.CharField(required=False, allow_blank=True)
    email = serializers.EmailField(required=False, allow_blank=True)
    password = serializers.CharField(style={'input_type': 'password'})

    def _validate_email(self, email, password):
        user = None

        if email and password:
            user = authenticate(email=email, password=password)
        else:
            msg = 'must input email and password'
            raise exceptions.ValidationError(msg)

        return user

    def _validate_username(self, username, password):
        user = None

        if username and password:
            user = authenticate(username=username, password=password)
        else:
            msg = 'must input username and password'
            raise exceptions.ValidationError(msg)

        return user

    def _validate_username_email(self, username, email, password):
        user = None

        if email and password:
            user = authenticate(email=email, password=password)
        elif username and password:
            user = authenticate(username=username, password=password)
        else:
            msg = 'must type in email and pwd or username and pwd'
            raise exceptions.ValidationError(msg)

        return user

    def validate(self, attrs):
        username = attrs.get('username')
        email = attrs.get('email')
        password = attrs.get('password')

        user = None

        if 'allauth' in settings.INSTALLED_APPS:
            from allauth.account import app_settings

            # Authentication through email
            if app_settings.AUTHENTICATION_METHOD == app_settings.AuthenticationMethod.EMAIL:
                user = self._validate_email(email, password)

            # Authentication through username
            if app_settings.AUTHENTICATION_METHOD == app_settings.AuthenticationMethod.USERNAME:
                user = self._validate_username(username, password)

            # Authentication through either username or email
            else:
                user = self._validate_username_email(username, email, password)

        else:
            # Authentication without using allauth
            if email:
                try:
                    username = User.objects.get(email__iexact=email).get_username()
                except User.DoesNotExist:
                    pass

            if username:
                user = self._validate_username_email(username, '', password)

        # Did we get back an active user?
        if user:
            if not user.is_active:
                msg = 'this user can not login'
                raise exceptions.ValidationError(msg)
        else:
            msg = '不能使用提供的信息登录'
            raise exceptions.ValidationError(msg)

        # If required, is the email verified?
        if 'rest_auth.registration' in settings.INSTALLED_APPS:
            from allauth.account import app_settings
            if app_settings.EMAIL_VERIFICATION == app_settings.EmailVerificationMethod.MANDATORY:
                email_address = user.emailaddress_set.get(email=user.email)
                if not email_address.verified:
                    raise serializers.ValidationError('email invalidate')

        return attrs

लॉगिन पैनल यह है:


मैं लॉगिन पैनल को दो क्षेत्रों में अनुकूलित करना चाहता हूं। एक username/telphone/email के लिए, दूसरा password के लिए।

लेकिन LoginSerializer को कैसे बदलें?

7
sof-03 17 जून 2018, 07:43

1 उत्तर

सबसे बढ़िया उत्तर

आप आसानी से उन 3 क्षेत्रों (ईमेल/उपयोगकर्ता नाम/फोन नंबर) को एक चारफिल्ड के साथ बदल सकते हैं और फिर सबसे आसान मामले में एक मैच खोजने के लिए सभी 3 क्षेत्रों के लिए पूछताछ करने का प्रयास कर सकते हैं।

अपने डेटाबेस पर क्वेरी लोड को कम करने के लिए, साधारण RegExes या यहां तक ​​कि साधारण चेक का उपयोग करके विभिन्न लॉगिन प्रकारों के बीच अंतर करने का एक तरीका अधिक विस्तृत है।

(आपके स्वीकृत फ़ोन नंबरों के प्रकार के आधार पर, फ़ोन लॉगिन निर्धारित करने के लिए आपको कुछ और जटिल जाँचों का उपयोग करने की आवश्यकता हो सकती है, जैसे +1 813 3181, +1 (317) 173-1375, ...)

तो सब कुछ, निम्न जैसा कुछ करेगा:

def validate(self, attrs):
    id_field = attrs.get('id_field')

    user = None

    if '@' in id_field:
        user = User.objects.filter(email__iexact=id_field).first()
    elif id_field.isdigit():
        user = User.objects.filter(phone_number=id_field).first()
    else:
        user = User.objects.filter(username__iexact=id_field).first()

    if not user:
        raise serializers.ValidationError("User does not exists")

    ...

    return attrs

संपादित करें

पाए गए उपयोगकर्ता के लिए पासवर्ड की जांच करने के लिए, आप Django का check_password फ़ंक्शन

पासवर्ड सत्यापन कुछ ऐसा होगा:

...

if not user.check_password(password):
    raise ValidationError('Invalid password')

...
# Now on, user's password is validated.
4
SpiXel 20 जून 2018, 09:35