You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 22:45:11