简体   繁体   English

注册后Django Rest Framework无法登录

[英]Django Rest Framework not login after registration

I have a site on the Django and I have custom User model. 我在Django上有一个网站,并且有自定义的用户模型。 On site, where I use Django Forms, I can register and after login, and it works well. 在我使用Django Forms的网站上,我可以注册并登录后再使用,效果很好。 Then I started to use a DRF and Django-rest-auth. 然后,我开始使用DRF和Django-rest-auth。 I write a custom register serializer, after I wrote a path for it in the settings. 在设置中为其写了路径之后,我编写了一个自定义寄存器序列化器。

from rest_framework import serializers
from ideas.models import Post, Unit, StatusOfPost
from accounts.models import User
from django.contrib.auth import authenticate
from django.contrib.auth import get_user_model
from allauth.account import app_settings as allauth_settings
from allauth.utils import email_address_exists
from allauth.account.adapter import get_adapter
from allauth.account.utils import setup_user_email

class RegisterSerializer(serializers.Serializer):
    phone_number = serializers.CharField(required=True, write_only=True)
    username = serializers.CharField(required=True, write_only=True)
    email = serializers.CharField(required=True, write_only=True)
    first_name = serializers.CharField(required=True, write_only=True)
    last_name = serializers.CharField(required=True, write_only=True)
    password1 = serializers.CharField(required=True, write_only=True)
    password2 = serializers.CharField(required=True, write_only=True)

    def get_cleaned_data(self):
        return {
            'first_name': self.validated_data.get('first_name', ''),
            'last_name': self.validated_data.get('last_name', ''),
            'address': self.validated_data.get('address', ''),
            'username': self.validated_data.get('username', ''),
            'password': self.validated_data.get('password', ''),
            'email': self.validated_data.get('email', ''),
            'phone_number': self.validated_data.get('phone_number',''),
        }

    def validate_email(self, email):
        email = get_adapter().clean_email(email)
        if allauth_settings.UNIQUE_EMAIL:
            if email and email_address_exists(email):
                raise serializers.ValidationError(
                    ("A user is already registered with this e-mail address."))
        return email

    def validate_username(self, username):
        username = get_adapter().clean_username(username)
        return username

    def validate_password1(self, password):
        return get_adapter().clean_password(password)

    def validate(self, data):
        if data['password1'] != data['password2']:
            raise serializers.ValidationError(
            ("The two password fields didn't match."))
        return data

    def save(self, request):
        adapter = get_adapter()
        user = adapter.new_user(request)
        self.cleaned_data = self.get_cleaned_data()
        adapter.save_user(request, user, self)
        setup_user_email(request, user, [])
        user.phone_number = self.cleaned_data.get('phone_number')
        user.save()
        return user

and it works too and creates a new user and it returns me a token. 而且它也可以正常工作并创建一个新用户,并向我返回一个令牌。 There is a new user in my admin. 我的管理员中有一个新用户。 But if I want to login in the my site like this new user, site writes me that username or password not valid. 但是,如果我想像这个新用户一样登录我的网站,则该网站会告诉我该用户名或密码无效。 And i don't understand why, that in my admin i see this user and i know that write a valid password (i tryied to create different users, but result is one) 而且我不明白为什么,在我的管理员中我看到了这个用户,并且我知道我写了一个有效的密码(我试图创建其他用户,但是结果是一个)

I noticed that in the my admin the password of the new user is not encoded as when registering on the site. 我注意到在我的管理员中,新用户的密码未编码为在网站上注册时的密码。

for comparison: 进行比较:

encoded password after registration by API 通过API注册后的编码密码

!Z2Aw4VpN34JidaSNmODVi5MJKRJHTgx0gfROnylA

encoded password after registration on the site: 在网站上注册后的编码密码:

pbkdf2_sha256$100000$aILnGtv6ClxI$KVg1lwjSKf0REZI/M85i2tN/mTUTLxngNVwo4YaCe08=

May be this is a problem, if so, than how is it fix? 可能是个问题,如果有的话,那怎么解决呢? I don't know. 我不知道。

Thanks to everyone 谢谢大家

In the function get_cleaned_data delete 在函数get_cleaned_data中删除

'password': self.validated_data.get('password', ''),

and insert 并插入

'password1': self.validated_data.get('password1', ''),
'password2': self.validated_data.get('password2', ''),

It solved my problem 它解决了我的问题

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM