在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:
- 登录校验直接使用DRF自带的
IsAuthenticated权限类,效果和LoginRequiredMixin完全一致 - 自定义模型权限校验可以自己实现一个简单的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
相关产品推荐
相关产品推荐

