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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:40:28