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

继承LoginRequiredMixin的视图是否需额外设置IsAuthenticated权限类?

问题

我有一个名为ProfileDetail的基于类的视图,它继承自django.contrib.auth.mixins中的LoginRequiredMixin,同时设置了permission_classes = (IsAuthenticated,)。由于访问该视图的客户端均已登录(即已通过身份验证),我想询问:是否仍有必要设置该权限类?请给出建议,谢谢。

对应的代码:

from django.contrib.auth.mixins import LoginRequiredMixin

from rest_framework import generics
from rest_framework.permissions import IsAuthenticated

from .models import Profile
from .serializers import ProfileSerializer


class ProfileDetail(LoginRequiredMixin, generics.RetrieveUpdateAPIView):
    permission_classes = (IsAuthenticated,)
    serializer_class = ProfileSerializer
回答

没必要同时保留两者,而且更建议移除LoginRequiredMixin,只保留DRF的IsAuthenticated权限类,原因如下:

  • LoginRequiredMixin是Django原生的混入类,原本是给传统模板视图(比如TemplateView、普通View)用的,它的核心逻辑是:如果用户未登录,就重定向到登录页面——这完全不符合API的交互逻辑,API应该返回标准化的HTTP状态码(比如401未授权),而不是跳转页面。
  • IsAuthenticated是DRF专门为API视图设计的权限类,它会检查请求的用户是否已认证:
    • 未认证时,会返回401 Unauthorized响应(带WWW-Authenticate头),这是API客户端期望的行为;
    • 已认证时,才允许访问视图逻辑,完全满足你的需求。

另外要注意:你的视图继承的是DRF的generics.RetrieveUpdateAPIView,属于API视图体系,DRF本身有一套完整的权限控制机制,LoginRequiredMixin在这里不仅多余,还可能引发不符合预期的行为(比如给API客户端返回重定向响应)。

最终优化后的代码可以改成这样:

from rest_framework import generics
from rest_framework.permissions import IsAuthenticated

from .models import Profile
from .serializers import ProfileSerializer


class ProfileDetail(generics.RetrieveUpdateAPIView):
    permission_classes = (IsAuthenticated,)
    serializer_class = ProfileSerializer

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:55:15