TLDR: как вы разрешаете определенным группам доступ к представлениям с помощью Django Rest Framework?
Я занимаюсь созданием веб-сервиса с помощью Django Rest Framework. Только (правильное) подмножество представлений предназначено для клиентов.
До сих пор я:
rest_framework.permissions.IsAdminUser
is_customer
(используя веб-сайт администратора Django)customers
и добавил всех соответствующих пользователей в эту группу (используя веб-сайт администратора)is_customer
на customers
(снова с помощью веб-сайта администратора)Все мои взгляды основаны на функциях. Чтобы предоставить соответствующее разрешение группе customers
, я попытался
from rest_framework.decorators import api_view
from django.contrib.auth.decorators import permission_required
@api_view(["POST"])
@permission_required(["is_customer"])
def my_func(request):
# calculations
return Response(...)
Обновлено: также попробовал метод ниже
from rest_framework import permissions
from rest_framework.decorators import api_view
class IsCustomer(permissions.BasePermission):
def has_permission(self, request, view):
if request.user.is_customer:
return True
return False
def has_object_permission(self, request, view, obj):
if request.user.is_customer:
return True
return False
@api_view(["POST"])
@permission_required([IsCustomer])
def my_func(request):
# calculations
return Response(...)
и
from rest_framework.decorators permission_classes, api_view
@api_view(["POST"])
@permission_classes(["is_customer"])
def my_func(request):
# calculations
return Response(...)
и ни один из них не работает. Каков правильный способ сделать это? Заранее благодарю за любой совет!
Последний блок должен работать, если вы напрямую ссылаетесь на класс:
from rest_framework.decorators permission_classes, api_view
@api_view(["POST"])
@permission_classes([IsCustomer])
def my_func(request):
# calculations
return Response(...)
Вы можете просмотреть документацию с аналогичным примером здесь: https://www.django-rest-framework.org/api-guide/permissions/
Класс IsCustomer
не был настроен должным образом. Вот как должен выглядеть класс:
class IsCustomer(permissions.BasePermission):
def has_permission(self, request, view):
if 'auth.is_customer' in request.user.get_all_permissions():
return True
return False
def has_object_permission(self, request, view, obj):
if 'auth.is_customer' in request.user.get_all_permissions():
return True
return False
Оттуда использование @permission_classes([IsCustomer])
работает по назначению. Поэтому окончательная форма представления:
@api_view(["POST"])
@permission_classes([IsCustomer])
def testing_post(request):
try:
someData = someCalculations()
return Response(data=someData, status=status.HTTP_200_OK)
except ValueError as e:
return Response(e.args[0], status.HTTP_400_BAD_REQUEST)
Я предполагаю, что проблема была с определением класса разрешений.
request.user
не имеет атрибутаis_customer
. Вы должны вернуть его разрешения, а затем посмотреть, есть ли в наборе соответствующий. Подробности смотрите в ответе, если интересно!