Как установить разрешения для запроса POST в ModelViewSet - PullRequest
0 голосов
/ 08 января 2019

Как я могу написать свой собственный класс разрешений для запросов POST при использовании ModelViewSet?

Я уже пытался написать свой собственный access_classe безуспешно. Даже если мой класс разрешений возвращает false, он все равно предоставляет доступ к почтовому запросу

models.py

class Building(models.Model, HitCountMixin):
    user                = models.ForeignKey(User, on_delete=models.CASCADE) limit_choices_to=Q(country=2921044) | Q(country=798544), on_delete=models.SET_NULL) #<------------ Eltern Element
    name                = models.CharField(max_length=200, null=True, blank=True)
    description         = models.TextField(max_length=2000,null=True, blank=True)
    facilities          = models.TextField(max_length=2000, null=True, blank=True)
    ...

views.py

class BuildingImageViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    serializer_class = BuildingImageSerializer
    permission_classes = (permissions.IsAuthenticated, IsOwner,)

    def get_queryset(self):
        if self.request.user.is_authenticated:
            return     BuildingImage.objects.filter(building__user=self.request.user)
        return None

permissions.py

class IsOwner(permissions.BasePermission):

    def has_object_permission(self, request, view, obj):
        print("TEST")
        return False

urls.py

router = routers.DefaultRouter()
router.register(r'buildingimages', myrest_views.BuildingImageViewSet, base_name="buildingimage")

Если я пытаюсь загрузить изображение, оно работает, почему? Мой класс разрешений IsOwner оценен, потому что я вижу строку печати с «TEST» в консоли.

МОЕ РЕШЕНИЕ:

def has_permission(self, request, view):

    if view.action == 'create':
        building_url    = request.POST.get('building')
        building_path   = urlparse(building_url).path
        building_id     = resolve(building_path).kwargs['pk']
        building        = Building.objects.get(id=building_id)
        return building.user == request.user

    return True

1 Ответ

0 голосов
/ 09 января 2019

Передайте список классов, которые вы использовали has_object_permission(), вам нужно написать код внутри has_permission() метода.

permission_classes = [<class 'rest_framework.permissions.AllowAny'>]

вы должны пройти класс, который выводит BasePermission класс

permission.py

from rest_framework import permissions

class IsOwner(permissions.BasePermission):

     def has_permission(self, request, view):
         if <CONDITION>:
             return True
         else:
             return False
...