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

如何在Django REST Framework视图集仅开放POST并限制GET权限

解决方案

问题根源

你当前的IsGetMethod权限类逻辑完全不符合需求:它直接拒绝所有安全方法(GET/HEAD/OPTIONS),同时对非安全方法(如POST)仅返回True,但忽略了GET方法需要对管理员开放的核心要求,另外如果项目全局配置了认证规则,未认证用户的POST请求也会被拦截。

修复步骤

1. 替换自定义权限类

删除原IsGetMethod类,编写能区分请求方法和用户身份的权限类:

from rest_framework import permissions

class UserPermission(permissions.BasePermission):
    def has_permission(self, request, view):
        # 允许所有用户调用POST方法(创建用户)
        if request.method == 'POST':
            return True
        # GET方法仅对已认证的管理员开放
        return request.user.is_authenticated and request.user.is_staff

2. 更新视图集配置

将UserViewSet的权限类替换为新的UserPermission:

class UserViewSet(viewsets.ModelViewSet):
    serializer_class = UserSerializer
    queryset = User.objects.all()
    permission_classes = [UserPermission]

效果验证

  • 未认证用户:可正常访问POST接口提交创建请求,访问GET接口会返回403权限拒绝
  • 已认证管理员:可正常访问GET接口查看用户列表,同时也能使用POST接口
  • 普通已认证用户:无法访问GET接口,仅能使用POST接口(如果需要限制普通用户不能POST,可在权限类中补充判断)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:38:25