如何为Django REST Framework现有注册视图编写类视图风格登录接口
基于DRF类视图的登录功能实现方案
本方案适配你现有使用djangorestframework-simplejwt的项目架构,无需额外引入依赖。
第一步:新增登录专用序列化器
在你现有serializer.py文件中添加以下代码,单独处理登录参数校验逻辑:
class LoginSerializer(serializers.Serializer): email = serializers.EmailField(max_length=255) password = serializers.CharField(min_length=8, max_length=65, write_only=True) def validate(self, attrs): email = attrs.get('email').lower() password = attrs.get('password') # 校验用户是否存在 try: user = User.objects.get(email=email) except User.DoesNotExist: raise serializers.ValidationError("用户不存在") # 校验密码是否匹配 if not user.check_password(password): raise serializers.ValidationError("密码错误") # 校验账号是否已激活(对应你注册逻辑里的邮箱验证,若暂未开启激活功能可删除此段) if not user.is_active: raise serializers.ValidationError("账号未激活,请先点击验证邮件链接完成激活") # 将用户对象返回给视图使用 attrs['user'] = user return attrs
第二步:编写登录类视图
在你现有视图文件中添加登录视图类,和你的注册视图风格保持一致:
class LoginView(GenericAPIView): serializer_class = LoginSerializer permission_classes = (permissions.AllowAny,) def post(self, request): serializer = self.get_serializer(data=request.data) # 校验失败自动返回400错误 serializer.is_valid(raise_exception=True) user = serializer.validated_data['user'] # 生成JWT令牌 refresh = RefreshToken.for_user(user) # 可根据业务需求自定义返回字段 return Response({ "user_id": user.id, "username": user.username, "email": user.email, "access_token": str(refresh.access_token), "refresh_token": str(refresh) }, status=status.HTTP_200_OK)
第三步:配置登录路由
在你的urls.py中添加登录接口路由:
from django.urls import path from .views import RegisterView, LoginView urlpatterns = [ # 你原有注册路由 path("register/", RegisterView.as_view(), name="register"), # 新增登录路由 path("login/", LoginView.as_view(), name="login"), ]
原有代码优化提示
- 你现有
UserSerializer的create方法重复调用了两次set_password,第二次传入的是confirm_password,虽然校验阶段已经保证两个密码一致,但冗余代码可以删除,仅保留user.set_password(validated_data['password'])即可 - 你现有
UserSerializer的Meta属性中write_only_fields写的是repeat_password,但实际字段名是confirm_password,需要修正避免配置不生效
内容的提问来源于stack exchange,提问作者maedeh
相关产品推荐
相关产品推荐

