Итак, я хочу создать конечные точки, где анонимный пользователь или не администратор может только POST. Конечные точки:
Я уже сделал настраиваемое разрешение и применил его к представлениям на основе классов.
#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?






есть две вещи:
allowed_methods = ('POST',)
вы забываете запятую (если нет запятой, это просто строка, но если есть запятая, это кортеж)
has_object_permissions - DRF вызывает его, когда вы хотите получить объект, а не создать объект.
POST использует для создания объектов, так что да, это has_permissions, а не has_object_permission
Значит, мы не можем использовать has_object_permission при передаче запроса POST? Спасибо :)