4

我正在使用 django-rest-framework。我遇到的问题是 POST 和 GET 方法的 url 相同,但我希望根据调用的方法具有不同的权限。现在我正在使用基于类的视图,我不知道如何根据方法设置不同的权限。我想要的是,如果用户是他们既 POST 又 GET 的管理员,如果用户经过身份验证,他们只能 GET,如果用户没有经过身份验证,他们将无能为力。

class CategoryList(generics.ListCreateAPIView):
    queryset = QuestionCategory.objects.all()
    serializer_class = QuestionCategorySerializer
    permission_classes = (permissions.IsAuthenticated,)
4

3 回答 3

7

只是一个更新。

您可以覆盖“get_permissions”而不是“get_queryset”。

例如:

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”返回权限实例列表,而不是类。

于 2017-07-20T02:54:53.310 回答
2

你可以把它写在一个函数中来覆盖默认函数来实现这一点。

用来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_queryset: https ://docs.djangoproject.com/en/dev/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin.get_queryset

你可以getpost你的generic viewhttps ://docs.djangoproject.com/en/dev/topics/class-based-views/mixins/#using-singleobjectmixin-with-view

于 2014-06-04T16:02:46.210 回答
1

我知道这晚了 - 但我最近不得不弄清楚同样的事情,并且在文档或互联网上几乎没有找到帮助。这就是我最终想出的——希望它可以帮助其他可能遇到同样问题的人:

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 文档

这是mixins的 django 文档

于 2015-01-30T16:49:44.020 回答