Итак, я хочу создать конечные точки, где 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?