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

如何自定义dj-rest-auth登录序列化器?含多字段验证与登录实现

自定义dj-rest-auth登录序列化器实现带额外字段的登录验证

1. 编写自定义登录序列化器

继承dj-rest-auth默认的LoginSerializer,添加所需字段并扩展验证逻辑,确保提交的额外字段与数据库中用户信息匹配:

from dj_rest_auth.serializers import LoginSerializer
from django.contrib.auth import get_user_model
from rest_framework import serializers

User = get_user_model()

class CustomLoginSerializer(LoginSerializer):
    # 添加需要验证的额外字段
    first_name = serializers.CharField(required=True)
    last_name = serializers.CharField(required=True)
    phone_number = serializers.CharField(required=True)

    def validate(self, attrs):
        # 先调用父类方法完成邮箱、密码的基础验证
        attrs = super().validate(attrs)
        user = self.user

        # 验证额外字段与用户信息是否匹配
        if user.first_name != attrs['first_name']:
            raise serializers.ValidationError("first_name 与用户信息不匹配")
        if user.last_name != attrs['last_name']:
            raise serializers.ValidationError("last_name 与用户信息不匹配")
        if user.phone_number != attrs['phone_number']:
            raise serializers.ValidationError("phone_number 与用户信息不匹配")

        return attrs

2. 配置settings替换默认序列化器

在项目settings.py中指定使用自定义的登录序列化器,同时确保JWT配置正常(如果你用simplejwt):

REST_AUTH = {
    'LOGIN_SERIALIZER': '你的应用名.serializers.CustomLoginSerializer',
    # JWT相关配置(根据你的实际需求调整)
    'USE_JWT': True,
    'JWT_AUTH_COOKIE': 'access_token',
    'JWT_AUTH_REFRESH_COOKIE': 'refresh_token',
}

3. 替换登录视图(可选,若需自定义视图逻辑)

如果需要对登录视图做额外扩展,可自定义LoginView并指定序列化器,再更新urls:

views.py

from dj_rest_auth.views import LoginView
from .serializers import CustomLoginSerializer

class CustomLoginView(LoginView):
    serializer_class = CustomLoginSerializer

urls.py

from django.urls import path, include
from .views import CustomLoginView

urlpatterns = [
    # 替换默认登录端点
    path('dj-rest-auth/login/', CustomLoginView.as_view(), name='rest_login'),
    # 保留原注册端点(你已确认注册功能正常)
    path('dj-rest-auth/registration/', include('dj_rest_auth.registration.urls')),
]

4. 测试登录请求

向/dj-rest-auth/login/发送POST请求,请求体需包含所有必填字段:

{
    "email": "user@example.com",
    "password": "你的密码",
    "first_name": "John",
    "last_name": "Doe",
    "phone_number": "1234567890"
}

所有字段验证通过后,会返回JWT令牌(若配置了JWT)或默认会话认证信息。

内容的提问来源于stack exchange,提问作者mtn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 15:09:20