Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何根据http请求在一个类视图中设置多个权限_Django_Django Views_Django Rest Framework_Django Permissions - Fatal编程技术网

Django 如何根据http请求在一个类视图中设置多个权限

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

我正在使用django rest框架。我遇到的问题是,POST和GET方法的url都是相同的,但我希望根据调用的方法拥有不同的权限。现在我使用的是基于类的视图,我不知道如何根据方法设置不同的权限。我想要的是,如果用户是一个管理员,他们可以发布和获取,如果用户经过身份验证,他们只能获取,如果用户没有经过身份验证,他们就不能做任何事情

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
这类函数,您只需要根据用户类型自动覆盖它们(匿名、用户、职员/管理员)我使用您的方法设置了一个不同的序列化程序类。这很好!因此我可以根据用户类型轻松地使用或多或少的合理信息进行响应。非常感谢!