Разрешение настраиваемого объекта Django Rest Framework не вызывается

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

  • API / v1 / ключевые слова /
  • api / v1 / keyword / $ 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

Я попытался изменить разрешения.IsAuthenticated на permissions.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?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
948
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

allowed_methods = ('POST',) 

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

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

Значит, мы не можем использовать has_object_permission при передаче запроса POST? Спасибо :)

Marsha 27.05.2018 14:54

POST использует для создания объектов, так что да, это has_permissions, а не has_object_permission

Andrey Berenda 27.05.2018 17:49

Другие вопросы по теме