如何在一个类视图中设置多个权限,具体取决于http请求

时间:2014-06-04 15:22:01

标签: django django-views django-rest-framework django-permissions

我正在使用django-rest-framework。我遇到的问题是POST和GET方法的url是相同的,但是我想拥有不同的权限,具体取决于调用的方法。现在我使用基于类的视图,我无法弄清楚如何根据方法设置不同的权限。我想要的是,如果用户是POST和GET的管理员,如果用户经过身份验证而不是他们只能获取,并且如果用户未经过身份验证,他们就无法做任何事情。

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

3 个答案:

答案 0 :(得分:3)

只是更新。

您可以覆盖' get_permissions'而不是' get_queryset'。

例如:

const records = [
    {
        value: 24,
        gender: "BOYS"
    },
    {
        value: 42,
        gender: "BOYS"
    },
    {
        value: 85,
        gender: "GIRLS"
    },
    {
        value: 12,
        gender: "GIRLS"
    },
    {
        value: 10,
        gender: "BOYS"
    }
]

function someFunction() {
  return records.reduce(function(sum, record){
    if(record.gender == 'BOYS') return sum + record.value;
    else return sum;
  }, 0);
}

console.log(someFunction())

请注意' get_permission'返回权限实例列表,而不是类。

答案 1 :(得分: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

您可以在gethttps://docs.djangoproject.com/en/dev/topics/class-based-views/mixins/#using-singleobjectmixin-with-view

中编写postgeneric view方法

答案 2 :(得分: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)

这是user objects

的django doc

这是exceptions

的django doc

这是mixins

的django doc