0

Я работаю с django-rest-framework. Проблема, с которой я сталкиваюсь, заключается в том, что URL-адрес идентичен для методов POST и GET, но я хочу иметь разные разрешения в зависимости от того, какой метод вызывается. Сейчас я использую представления на основе классов, и я не могу понять, как устанавливать разные разрешения в зависимости от метода. Я хочу, если пользователь является администратором, которым они являются как POST, так и GET, если пользователь аутентифицирован, чем они могут только GET, и если пользователь не аутентифицирован, они ничего не могут сделать.Как установить несколько разрешений в одном классе, в зависимости от http-запроса

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

ответ

0

Вы можете написать его в функции, чтобы переопределить функцию по умолчанию, чтобы реализовать это.

использование 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

И вы можете написать get или post метод в generic view: https://docs.djangoproject.com/en/dev/topics/class-based-views/mixins/#using-singleobjectmixin-with-view

+0

Это похоже на то, что я хотел бы использовать, но мой код никогда не попадает в get_context_data – andrew13331

+0

Код будет автоматически удалять 'get_context_data',' get_queryset' такие функции, вам просто нужно переопределить их – WeizhongTu

0

я знаю, что это поздно, чтобы вечеринка - но мне недавно пришлось разобраться в том же, и мне очень мало помогли в этом cs или на interwebs. это то, что я в конце концов придумал - надеюсь, что это помогает кто-то, кто мог бы иметь такую ​​же проблему:

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

здесь является Джанго док для exceptions

здесь django doc для mixins

0

Просто обновление.

Вы можете переопределить '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' возвращает список экземпляров разрешений, а не классы.