我正在 drf 中创建一个通过令牌进行登录验证的应用程序,但我遇到了一个问题,我无法生成登录信息,因为尽管我创建了用户并分配了一个令牌,我无法执行登录验证:
这是我的模型:
from django.db import models
from django.conf import settings
from django.dispatch import receiver
from django.db.models.signals import post_save
from django.contrib.auth.models import AbstractUser
from rest_framework.authtoken.models import Token
class User(AbstractUser):
def get_full_name(self):
return f'{self.first_name} {self.last_name}'
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_token_user(sender, instance, **kwargs):
if kwargs.get('created', False):
Token.objects.create(user=instance)
这是我的序列化程序:
from django.contrib.auth.hashers import make_password
from rest_framework import serializers
from .models import User
class UserSerializer(serializers.ModelSerializer):
password2 = serializers.CharField(write_only=True)
class Meta:
model = User
fields = (
'first_name', 'last_name', 'username', 'email', 'password', 'password2'
)
def validate(self, data):
if data.get('password') != data.get('password2'):
raise serializers.ValidationError('Las contraseñas no son iguales')
return data
def create(self, validated_data):
return User.objects.create(
first_name=validated_data.get('first_name'),
last_name=validated_data.get('last_name'),
username=validated_data.get('username'),
email=validated_data.get('email'),
password=make_password(validated_data.get('password'))
)
这是我的观点:
class CreateUser(APIView):
authentication_classes = [SessionAuthentication, BasicAuthentication]
permission_classes = [IsAuthenticated]
def post(self, request, format=None):
serializer = UserSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status.HTTP_200_OK)
return Response(serializer.errors, status.HTTP_400_BAD_REQUEST)
我知道 drf 提供登录:
path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
但是我想创建自己的自定义登录,并且我已经完成了文档中提供的测试身份验证,但仍然没有生成我需要的登录验证:
class AuthenticationUser(authentication.BaseAuthentication):
def authenticate(self, request):
username = request.META.get('username')
if not username:
return None
try:
user = settings.AUTH_USER_MODEL.objects.get(username=username)
except User.DoesNotExist:
raise exceptions.AuthenticationFailed('Not exist user')
return (user, None)