Разрешение пользовательского объекта Django Rest Framework не вызывается - PullRequest
0 голосов
/ 27 мая 2018

Итак, я хочу создать конечные точки, где Anon или не администратор может только POST.Конечные точки:

  • API / V1 / Keywords /
  • API / V1 / ключевое слово / $ id

Я уже сделал пользовательское разрешение и применитьэто в представлениях на основе классов.

#permissions.py
from rest_framework import permissions

class AnonWriteOnly(permissions.BasePermission):
    """
    Anon can only post
    """
    def has_object_permission(self, request, view, obj):
        # Only allow post request
        allowed_methods = ('POST')  
        if request.method in allowed_methods:
            print (True) #debugging purpose
            return True
        print(False) #debugging purpose
        return permissions.IsAuthenticated.has_permission(self, request, view)

Это мои представления:

# Anon can post.

#Corresponds to the first endpoint
class KeywordList(generics.ListCreateAPIView):
    """
    List all keywords, or create a new keyword
    """
    permission_classes = [AnonWriteOnly]
    queryset = Keyword.objects.all()   
    serializer_class = KeywordSerializer

#Corresponds to the second endpoint
class KeywordDetail(generics.RetrieveDestroyAPIView):
    """
    Retrieve, update, delete keyword
    """
    permission_classes = [AnonWriteOnly]
    queryset = Keyword.objects.all()
    serializer_class = KeywordSerializer

Когда я не вошел в систему и не попытался открыть вторую конечную точку, он работает нормально.Он имеет ответ 403. Выходные данные также выводятся на печать.

False
[27/May/2018 18:14:33] "GET /api/v1/keyword/1 HTTP/1.1" 403 10621

Но когда я пытаюсь открыть первую конечную точку, она ничего не печатает, она просто работает нормально, без разрешения.

[27/May/2018 18:28:02] "GET /api/v1/keywords/ HTTP/1.1" 200 13256

Я пытался изменить разрешения. Аутентифицирован на разрешения. IsAdminUser, но все же не повезло.

Но он работает нормально, переопределяя has_permission

from rest_framework import permissions

class AnonWriteOnly(permissions.BasePermission):
    """
    Anon can only post
    """
    def has_permission(self, request, view):
        # Only allow post request
        allowed_methods = ('POST')  
        if request.method in allowed_methods:
            print (True)
            return True
        print(False)
        return request.user.is_staff

Почемуэто не работает с has_object_permission?

1 Ответ

0 голосов
/ 27 мая 2018

есть две вещи:

allowed_methods = ('POST',) 

вы забыли запятую (если нет запятой, это просто строка, но если есть запятая, это кортеж)

has_object_permissions - вызовы DRFэто когда хочешь получить объект, а не создавать объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...