В чем разница между разрешением объекта и разрешением в DRF:Permission?
я путаю с BasePermission в Django-rest-framework.
здесь я определил класс: IsAuthenticatedAndOwner.
class IsAuthenticatedAndOwner(BasePermission):
    message = 'You must be the owner of this object.'
    def has_permission(self, request, view):
        print('called')
        return False
    def has_object_permission(self, request, view, obj):
        # return obj.user == request.user
        return False
используя в views.py
class StudentUpdateAPIView(RetrieveUpdateAPIView):
    serializer_class = StudentCreateUpdateSerializer
    queryset = Student.objects.all()
    lookup_field = 'pk'
    permissions_classes = [IsAuthenticatedAndOwner]
но это не работает вообще.Каждый может передать разрешение и обновить данные.
The called не было напечатано.
и я использовал для определения этого класса:IsNotAuthenticated
class IsNotAuthenticated(BasePermission):
    message = 'You are already logged in.'
    def has_permission(self, request, view):
        return not request.user.is_authenticated()
он хорошо работает в функции
class UserCreateAPIView(CreateAPIView):
    serializer_class = UserCreateSerializer
    queryset = User.objects.all()
    permission_classes = [IsNotAuthenticated]
Итак, в чем разница между приведенными выше примерами и функцией has_object_permission&has_permission?
2 ответов
в принципе, первый код отрицает все, потому что has_permission вернуть False.
has_permission это проверка перед вызовом has_object_permission. Это означает, что вы нужно разрешен has_permission прежде чем вы получите любой шанс проверить тест владения.
ты хочешь:
class IsAuthenticatedAndOwner(BasePermission):
    message = 'You must be the owner of this object.'
    def has_permission(self, request, view):
        return request.user and request.user.is_authenticated
    def has_object_permission(self, request, view, obj):
        return obj.user == request.user
Это также позволит авторизованным пользователям создавать новые элементы или их список.
у нас есть следующие два метода разрешений для класса BasePermission:
- def has_permission (self, запрос, просмотр)
- def has_object_permission (self, request, view, obj)
эти два различных метода призвал к ограничению несанкционированных пользователей для ввода данных и манипуляции.
has_permission вызывается по всем HTTP-запросам, тогда как has_object_permission вызывается из Метод Django DRF def get_object(self). Следовательно,has_object_permission метод доступен GET, PUT, DELETE, не POST запрос.
в итоге:
- 
permission_classesзакольцованы над определенным списком.
- 
has_object_permissionметод вызывается послеhas_permissionметод возвращает значениеTrueза исключением метода POST (в методе POSThas_permissionбыть только казнен).
- , когда Falseзначение возвращается изpermission_classesметод, запрос не получает разрешения и не будет цикл больше, в противном случае, он проверяет все разрешения на цикл.
- 
has_permissionметод будет вызываться на всех (GET,POST,PUT,DELETE)HTTPзапрос.
- способ has_object_permission не назовут HTTPPOSTзапрос, поэтому нам нужно ограничить его отhas_permissionметод.
