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

