Python Can';不要登录我的用户,他们不会';我似乎没有正确注册
我正在尝试登录我在注册视图中注册的用户(其中我得到一个200代码,表明POST请求成功),但当我尝试登录他们时,我得到“无法使用提供的凭据登录”。当我使用User.objects.all()签入shell时,我只返回了我的超级用户,因此我认为用户没有保存到数据库中。我不明白为什么会发生这种情况,所以如果有人有想法,我将不胜感激 这是密码 型号:Python Can';不要登录我的用户,他们不会';我似乎没有正确注册,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在尝试登录我在注册视图中注册的用户(其中我得到一个200代码,表明POST请求成功),但当我尝试登录他们时,我得到“无法使用提供的凭据登录”。当我使用User.objects.all()签入shell时,我只返回了我的超级用户,因此我认为用户没有保存到数据库中。我不明白为什么会发生这种情况,所以如果有人有想法,我将不胜感激 这是密码 型号: from django.db import models, transaction from django.conf import settings f
from django.db import models, transaction
from django.conf import settings
from django.contrib.auth.models import BaseUserManager, AbstractUser
class UserManager(BaseUserManager):
@transaction.atomic
def create_user(self, email, username, password=False):
if not email:
raise ValueError('Users must have an email address')
if not username:
raise ValueError('Users must have an username')
user = self.model(
email=self.normalize_email(email),
username=username,
)
user.set_password(password)
user.save()
return user
def get_by_natural_key(self, username):
return self.get(username=username)
def create_superuser(self, username, password, email):
user = self.create_user(
username=username,
email=email,
password=password,
)
user.is_superuser = True
user.save(using=self._db)
return user
class User(AbstractUser):
email = models.EmailField(
verbose_name='email address',
max_length=255,
unique=True,
)
username = models.CharField(
verbose_name= 'username',
max_length= 50,
unique=True,
)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email']
def __str__(self):
return str(self.username)
序列化程序:
from django.contrib.auth.models import User
from rest_framework import serializers
from backend.models import User
from django.contrib.sites.shortcuts import get_current_site
from django.db.models import Q
from rest_framework.validators import UniqueValidator
from rest_framework.authtoken.models import Token
from django.contrib.auth import authenticate, get_user_model
user = get_user_model()
class UserRegistrationSerializer(serializers.ModelSerializer):
username = serializers.CharField(
required=True,
validators=[UniqueValidator(queryset=User.objects.all(),lookup='iexact')]
)
email = serializers.CharField(
required=True,
validators=[UniqueValidator(queryset=User.objects.all(),lookup='iexact')]
)
password = serializers.CharField(
required=True,
label="Password",
style={'input_type': 'password'}
)
password_2 = serializers.CharField(
required=True,
label="Confirm Password",
style={'input_type': 'password'}
)
class Meta:
model = User
fields = ['username', 'email', 'password', 'password_2',]
def validate_password(self, value):
if len(value) < 8:
raise serializers.ValidationError(
"Password should be at least 8 characters long.")
return value
def validate_password_2(self, value):
data = self.get_initial()
password = data.get('password')
if password != value:
raise serializers.ValidationError("Passwords don't match.")
return value
def validate_username(self, value):
if User.objects.filter(username=value).exists():
raise serializers.ValidationError("Username already exists.")
return value
def create(self, validated_data):
user = User(
email=validated_data['email'],
username=validated_data['username']
)
user.set_password(validated_data['password'])
user.save()
return user
class UserLoginSerializer(serializers.ModelSerializer):
username = serializers.CharField(
required=True,
write_only=True,
)
token = serializers.CharField(
allow_blank=True,
read_only=True
)
password = serializers.CharField(
required=True,
write_only=True,
style={'input_type': 'password'}
)
class Meta(object):
model = User
fields = ['username', 'password', 'token']
def validate(self, data):
username = data.get('username', None)
password = data.get('password', None)
if username and password:
user = authenticate(request=self.context.get('request'),
username=username, password=password)
if not user:
msg = 'Unable to log in with provided credentials.'
raise serializers.ValidationError(msg, code='authorization')
else:
msg = "Must include username and password."
raise serializers.ValidationError(msg, code='authorization')
data['user'] = user
return data
在settings.py文件中检查您已将用户模型配置为自定义用户。你应该有这样的东西:
AUTH\u USER\u MODEL='accounts.USER'
其中“accounts”是django应用程序的名称,您可以在该应用程序中定义用户模型,您必须调用序列化程序的
save
方法(该方法将调用您的create
方法)来实际创建用户:
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
问题是我需要在用户之后添加“user.set_password(validated_data['password'])”。这就解决了问题
def create(self, validated_data):
user = User(
email=validated_data['email'],
username=validated_data['username']
)
user.set_password(validated_data['password'])
user.save()
return user
你还没有像你说的那样创建用户。。。如果序列化程序有效,您将返回一个响应…谢谢您的回答。现在,如果调用Use.objects.all(),我确实会看到所有用户名,但我仍然无法登录它们,我会遇到相同的错误…尝试在
user=authenticate(request=self.context.get('request'),username=username,password=password)之后添加。让我知道怎么回事。@ToniSredavonic你是说就在它下面吗?如果是这样的话,我只知道“login”和“request”是未定义的变量。
def create(self, validated_data):
user = User(
email=validated_data['email'],
username=validated_data['username']
)
user.set_password(validated_data['password'])
user.save()
return user