Django REST Framework:如何仅为ViewSet的retrieve方法设置AllowAny权限
解决ViewSet仅为retrieve方法设置AllowAny权限的问题
你的问题出在两个核心点:
- 全局
permission_classes直接设为AllowAny,导致所有方法都默认继承了这个权限 - DRF的
ViewSet原生不支持permission_classes_per_method这类自定义属性
正确的实现方式是重写get_permissions方法,根据当前请求对应的action动态返回权限类:
from rest_framework import viewsets, permissions class PostLanguageViewSet(viewsets.ViewSet): # 为除retrieve外的方法设置默认权限(示例为登录验证,可根据需求修改) permission_classes = (permissions.IsAuthenticated,) def get_permissions(self): # 判断当前请求对应的action是retrieve时,返回AllowAny权限 if self.action == 'retrieve': return [permissions.AllowAny()] # 其他方法沿用默认的permission_classes配置 return super().get_permissions() def retrieve(self, request, post_id=None, post_language_id=None, *args, **kwargs): # 你的业务逻辑 ... def destroy(self, request, post_id=None, post_language_id=None, *args, **kwargs): # 你的业务逻辑 ... def update(self, request, post_id=None, post_language_id=None, *args, **kwargs): # 你的业务逻辑 ...
关键说明
get_permissions是DRF提供的钩子方法,专门用于返回当前请求对应的权限实例列表self.action会自动匹配当前请求对应的ViewSet方法(比如GET详情请求对应retrieve,DELETE请求对应destroy)- 如果需要给其他方法单独设置权限,只需在
get_permissions中添加更多elif判断即可
内容的提问来源于stack exchange,提问作者MdHassan413
相关产品推荐
相关产品推荐

