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

Django REST Framework IsAdminUser未限制非管理员用户问题求助

问题原因及解决方案

嘿,我知道你为啥遇到这个问题了!DRF的@permission_classes装饰器并不是对所有函数视图都生效的——它只适用于DRF的APIView类视图,或者用DRF提供的@api_view装饰器包裹的函数视图。你现在写的是普通的Django函数视图,DRF不会主动介入它的请求流程,所以权限校验根本没被触发,匿名用户自然能直接拿到响应。

下面给你两种可行的解决方案:

方案一:用@api_view包装函数视图(推荐)

这是最符合DRF规范的做法,用@api_view装饰器把你的函数视图转换成DRF能处理的视图,这样权限校验、请求解析、响应处理都会按照DRF的流程来:

from rest_framework.decorators import permission_classes, api_view
from rest_framework.permissions import IsAdminUser
from rest_framework.response import Response

# 指定该视图允许的HTTP方法,比如GET(根据你的需求调整)
@api_view(['GET'])
@permission_classes([IsAdminUser])
def testing(request):
    return Response({
        "status": "ok", 
        "user": request.user.username, 
        "is_staff": request.user.is_staff
    })

这里把JsonResponse换成了DRF的Response,它会自动处理内容协商(比如根据请求头返回JSON或XML格式),当然如果你坚持要用JsonResponse也可以,但Response是DRF的标准做法,更推荐使用。

方案二:手动在函数内校验权限

如果你不想用@api_view,也可以手动实例化权限类并完成校验:

from rest_framework.permissions import IsAdminUser
from django.http import JsonResponse, HttpResponseForbidden

def testing(request):
    # 实例化IsAdminUser权限类
    admin_permission = IsAdminUser()
    # 调用has_permission方法校验,函数视图没有self,第二个参数传None
    if not admin_permission.has_permission(request, None):
        return HttpResponseForbidden({
            "detail": "你没有访问该资源的权限,请使用管理员账号登录。"
        })
    return JsonResponse({
        "status": "ok", 
        "user": request.user.username, 
        "is_staff": request.user.is_staff
    })

这种方式更灵活,但需要自己处理权限校验后的响应,不如第一种方案省心。

最后再确认下:确保你的URL配置正确指向这个视图,并且项目的INSTALLED_APPS里已经添加了'rest_framework',DRF的基础配置没问题哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:33:13