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
相关产品推荐
相关产品推荐

