Как вернуть данные с ошибкой 403 в Django Rest Framework?
когда запрос GET переходит на сервер API в /obj/1
Я проверяю пользовательский класс разрешений, чтобы узнать, имеет ли пользователь доступ, если нет, 403 отправляется обратно.
однако я хотел бы прикрепить идентификатор объекта, чтобы пользователь мог нажать кнопку на интерфейсе, чтобы запросить доступ.
моя текущая реализация должна переопределить retrieve
метод и" вручную " проверьте разрешение там.
упрощенный Разрешения
class CustomPerm(...):
def has_object_permission(...):
return request.user.is_staff
Viewset
class CustomViewSet(...):
model = Model
permission_classes = (CustomPerm, )
def retrieve(self, request, pk=None):
obj = get_object_or_404(Model, pk=pk)
has_perm = CustomPerm().has_object_permission(request, self, obj=obj)
if not has_perm:
data = { 'id': obj.id }
return Response(data, status=403)
return super(ModelViewSet, self).retrieve(request, pk=pk)
Итак, мой текущий метод, has_perm
возвращает набор запросов пользователей вместо логического значения, определенного в методе разрешений. Почему?
есть ли более чистый подход к этому?
1 ответов
from rest_framework import permissions
from rest_framework.exceptions import PermissionDenied
class CustomPerm(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if request.user.is_staff:
return True
raise PermissionDenied({"message":"You don't have permission to access",
"object_id": obj.id})
и вам не нужно переопределять извлечь метод
class CustomViewSet(...):
model = Model
permission_classes = (CustomPerm, )