Django 如何根据http请求在一个类视图中设置多个权限
我正在使用django rest框架。我遇到的问题是,POST和GET方法的url都是相同的,但我希望根据调用的方法拥有不同的权限。现在我使用的是基于类的视图,我不知道如何根据方法设置不同的权限。我想要的是,如果用户是一个管理员,他们可以发布和获取,如果用户经过身份验证,他们只能获取,如果用户没有经过身份验证,他们就不能做任何事情Django 如何根据http请求在一个类视图中设置多个权限,django,django-views,django-rest-framework,django-permissions,Django,Django Views,Django Rest Framework,Django Permissions,我正在使用django rest框架。我遇到的问题是,POST和GET方法的url都是相同的,但我希望根据调用的方法拥有不同的权限。现在我使用的是基于类的视图,我不知道如何根据方法设置不同的权限。我想要的是,如果用户是一个管理员,他们可以发布和获取,如果用户经过身份验证,他们只能获取,如果用户没有经过身份验证,他们就不能做任何事情 class CategoryList(generics.ListCreateAPIView): queryset = QuestionCategory.obj
class CategoryList(generics.ListCreateAPIView):
queryset = QuestionCategory.objects.all()
serializer_class = QuestionCategorySerializer
permission_classes = (permissions.IsAuthenticated,)
您可以将其写入函数以覆盖默认函数来实现这一点 使用
self.request
执行此操作
class CategoryList(generics.ListCreateAPIView):
serializer_class = QuestionCategorySerializer
permission_classes = (permissions.IsAuthenticated,)
def get_queryset(self):
# this function used to get queryset
# override this to judge request method
if self.request.method == 'POST':
self.permission_classes = (permissions.IsAdminUser,)
return QuestionCategory.objects.all()
获取查询集:
你可以在你的
通用视图中编写get
或post
方法:我知道聚会已经晚了,但我最近不得不想出同样的办法,在文档或互联网上几乎找不到什么帮助。这就是我最终想到的——希望它能帮助其他可能有同样问题的人:
from request_admin.models import Rep
from request_admin.serializers import RepSerializer
from rest_framework import generics
from rest_framework import permissions
from rest_framework import mixins
from django.core.exceptions import PermissionDenied
class RepList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
paginate_by = 10
queryset = Rep.objects.all()
serializer_class = RepSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
if request.user.is_authenticated() == False:
raise PermissionDenied
return self.create(request, *args, **kwargs)
这是给你的django医生
这是给你的django医生
这是django文档的更新
您可以覆盖“获取权限”而不是“获取查询集”
例如:
def get_permissions(self):
if self.request.method == 'GET':
return [permissions.AllowAny()]
elif self.request.method == 'DELETE':
return [permissions.IsAdminUser()]
else: # PUT, PATCH
return [...]
请注意,“get_permission”返回的是权限实例列表,而不是类。这似乎是我想要使用的,但我的代码从未命中get_context_数据代码将命中get_context_data
,get_queryset
这类函数,您只需要根据用户类型自动覆盖它们(匿名、用户、职员/管理员)我使用您的方法设置了一个不同的序列化程序类。这很好!因此我可以根据用户类型轻松地使用或多或少的合理信息进行响应。非常感谢!