Как добавить разрешения Django Rest framework только для определенного метода?
У меня есть следующие функции в REST API для модели пользователя. Я хочу установить разрешение только по запросу при которой любой пост. Может кто-нибудь мне помочь.
class UserList(APIView):
"""Get and post users data."""
def get(self, request, format=None):
"""Get users."""
users = User.objects.all()
serialized_users = UserSerializer(users, many=True)
return Response(serialized_users.data)
def post(self, request, format=None):
"""Post users."""
serializer = UserSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
2 ответов
вы можете написать пользовательский класс разрешений IsPostOrIsAuthenticated
что позволит неограниченный доступ к POST
запросы, но разрешат только аутентифицированные GET
запросы.
для реализации пользовательского разрешения IsPostOrIsAuthenticated
, переопределить BasePermission
класс и реализовать .has_permission(self, request, view)
метод. Метод должен возвращать True
если запрос должен быть предоставлен доступ, и False
иначе.
from rest_framework import permissions
class IsPostOrIsAuthenticated(permissions.BasePermission):
def has_permission(self, request, view):
# allow all POST requests
if request.method == 'POST':
return True
# Otherwise, only allow authenticated requests
# Post Django 1.10, 'is_authenticated' is a read-only attribute
return request.user and request.user.is_authenticated
так, все POST
запросы будут неограниченный доступ. Для других запросов потребуется аутентификация.
теперь вам нужно включить этот пользовательский класс разрешений в глобальные настройки.
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'my_app.permissions.IsPostOrIsAuthenticated',
)
}
http://www.django-rest-framework.org/api-guide/permissions/
согласно вышеуказанному URL вы должны написать один пользовательский класс разрешений
class ExampleView(APIView):
permission_classes = (MyCUstomAuthenticated,)
напишите свою собственную логику, используя AllowAny или IsAuthenticated внутри MyCUstomAuthenticated на основе POST и GET