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

在DRF API视图中使用LoginRequiredMixin、PermissionRequiredMixin是否可行?

结论:不建议直接搭配使用

LoginRequiredMixin和PermissionRequiredMixin是Django原生为传统模板视图设计的Mixin,和DRF API视图的执行逻辑、响应格式都不兼容,直接套用会出现以下问题:

  • 未登录/权限不足时,Django原生Mixin会返回302重定向到登录页,或返回HTML格式的403错误,不符合API接口返回JSON格式错误、对应401/403状态码的要求,前端调用接口时无法正常识别错误类型
  • 两个Mixin的权限校验逻辑触发时机和DRF自带的权限体系冲突,可能会出现校验顺序错乱、部分DRF功能失效的问题

正确实现方案

你需要的登录校验、自定义权限校验的需求,用DRF原生的权限体系就可以实现,无需复用Django传统视图的Mixin:

  1. 登录校验直接使用DRF自带的IsAuthenticated权限类,效果和LoginRequiredMixin完全一致
  2. 自定义模型权限校验可以自己实现一个简单的DRF权限类,对应PermissionRequiredMixin的功能

示例代码

from rest_framework import generics, permissions
from django.contrib.auth.models import User
from .serializers import UserSerializer

# 自定义权限类,实现指定权限校验
class CustomBranchManagerPermission(permissions.BasePermission):
    def has_permission(self, request, view):
        return request.user.has_perm("accounts.view_branchmanager")

class UserAPI(generics.ListAPIView):
    queryset = User.objects.filter(user_type="BRANCH_MANAGER")
    serializer_class = UserSerializer
    # 配置权限类,先校验登录,再校验自定义权限
    permission_classes = [permissions.IsAuthenticated, CustomBranchManagerPermission]

如果是通过浏览器访问DRF的调试界面,默认就会自动跳转到api-auth/login/登录页,不需要额外配置login_url参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:27:02