如何在 drf 中创建登录名

时间:2021-03-15 01:45:54

标签: django django-rest-framework

我正在 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)

0 个答案:

没有答案