如何基于DRF构建Token认证的登录Serializer与View?
登录功能实现方案
1. 登录Serializer
登录仅需验证邮箱和密码,无需与模型直接绑定,用serializers.Serializer自定义验证逻辑即可:
from rest_framework import serializers from django.contrib.auth import authenticate from .models import AuthUser class LoginSerializer(serializers.Serializer): email = serializers.EmailField(required=True) password = serializers.CharField(required=True, write_only=True) def validate(self, attrs): email = attrs.get('email') password = attrs.get('password') # 校验用户是否存在 try: user = AuthUser.objects.get(email=email) except AuthUser.DoesNotExist: raise serializers.ValidationError("邮箱或密码错误") # 校验密码是否匹配 if not user.check_password(password): raise serializers.ValidationError("邮箱或密码错误") attrs['user'] = user return attrs
2. 登录View
用APIView处理POST请求,完成验证后返回Token:
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from rest_framework.authtoken.models import Token from .serializers import LoginSerializer class LoginView(APIView): def post(self, request): serializer = LoginSerializer(data=request.data) serializer.is_valid(raise_exception=True) user = serializer.validated_data['user'] # 获取或生成用户Token token, created = Token.objects.get_or_create(user=user) return Response({'token': token.key}, status=status.HTTP_200_OK)
3. 配置URL路由
在项目urls.py中添加登录端点:
from django.urls import path from .views import Signup, LoginView urlpatterns = [ path('signup/', Signup.as_view(), name='signup'), path('login/', LoginView.as_view(), name='login'), ]
注意事项
- 确保
AuthUser模型继承了AbstractBaseUser或内置User模型,这样check_password方法才能正常工作 - 登录请求需以POST方式发送,请求体需包含
email和password两个字段
内容的提问来源于stack exchange,提问作者Suraj_7879
相关产品推荐
相关产品推荐

