如何自定义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
相关产品推荐
相关产品推荐

