access_classes не работает.где проблема? - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь выяснить, как работает разрешение Restframework, поэтому я пытаюсь написать код, который отвечает простому Json.Но наличие или отсутствие 100 permission_classes не влияет на выполнение кода, и конечная точка будет отвечать на все запросы без проверки какого-либо разрешения.

вот мой код:

class TeacherStatisticPost(generics.RetrieveAPIView):
    permission_classes = (ClassOwnerPermission)
    queryset = ClassRoom.objects.all()
    lookup_field = "id"
    lookup_url_kwarg = 'classRoom_id'

    def get_klass(self):
        class_id = self.kwargs['classRoom_id']
        return ClassRoom.objects.get(id=classRoom_id)

    def get(self, request, *arg, **kwargs):
        klass = self.get_klass()
        response ={
             'class_room_grade' : klass.grade,
              'class_room_name' : klass.name,
             }
        return JsonResponse(response, safe=False)

и вот мое разрешение.py:

class ClassOwnerPermission(permissions.BasePermission):

    def has_perm(self, user, klass):
        print("now in class perm") # never print out any thing!
        return klass.owner == user

    def has_object_permission(self, request, view, obj): # where is come from 'obj' ?
        return self.has_perm(request.user, obj)

я пытаюсь установить разрешение, к которому только владелец ClassRoom может получить доступэта конечная точка.

1 Ответ

2 голосов
/ 28 мая 2019

Во-первых, DRF ожидает, что permission_classes будет списком или кортежем. permission_classes в строке permission_classes = (ClassOwnerPermission) не является ни кортежем, ни списком. Поставьте запятую после ClassOwnerPermission.

Линия permission_classes = (ClassOwnerPermission, ) должна работать.

Во-вторых, вы не используете get_object метод, который проверяет разрешения. Удалите метод def get_klass(self): и используйте get_object

Ваш взгляд должен выглядеть следующим образом:

class TeacherStatisticPost(generics.RetrieveAPIView):
    permission_classes = (ClassOwnerPermission, )
    queryset = ClassRoom.objects.all()
    lookup_field = "id"
    lookup_url_kwarg = 'classRoom_id'

    def get(self, request, *arg, **kwargs):
        klass = self.get_object()
        response ={
             'class_room_grade' : klass.grade,
              'class_room_name' : klass.name,
             }
        return JsonResponse(response, safe=False)
...