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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:15:05