"detail": "Учетные данные для аутентификации не были предоставлены." django-rest_framaework

Я делаю свой собственный проект питомца, и мне нужно сделать права для пользователей. Когда пользователь регистрируется и создает предмет, только он/она может удалять/изменять предмет. Но когда я делаю разрешения, затем вхожу под учетной записью пользователя и пытаюсь создать предмет, я получаю ошибку (метод get работает).

<
from .permissions import IsOnwerOrReadOnly

class CreateItemView(APIView):

   serializer_class = CreateItemSerializer
   permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsOnwerOrReadOnly]

   def post(self, request):
       serializer = self.serializer_class(data=request.data)
       serializer.is_valid(raise_exception=True)
       serializer.save(owner=self.request.user)
       return Response(_('item created successfully'), status=status.HTTP_201_CREATED)
   
   def get(self, request, pk, format=None):
       item = [item.name for item in CreateItem.object.all()]
       description = [item.description for item in CreateItem.object.all()]
       type_item  = [item.type_item  for item in CreateItem.object.all()]
       price = [item.price  for item in CreateItem.object.all()]
       return Response({'name':item[pk], 'description':description[pk], 
                        'type_item':type_item[pk], 'price':price[pk]}, status=status.HTTP_200_OK)

   def patch(self, request, pk):
       instance = get_object_or_404(CreateItem, id=pk)
       serializer = CreateItemSerializer(instance, data=request.data, partial=True)
       serializer.is_valid(raise_exception=True)
       serializer.save()
       return Response(_("item updated successfully"), status=status.HTTP_200_OK)
   
   def delete(self, request, pk):
       item = CreateItem.object.get(id=pk)
       item.delete()
       return Response(_("item deleted successfully"), status=status.HTTP_204_NO_CONTENT)

permissions.py

from rest_framework import permissions


class IsOnwerOrReadOnly(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True
        return obj.owner == request.user

urls.py(items_app)

from .views import CreateItemView
from django.urls import path
urlpatterns = [
    path('item-create/', CreateItemView.as_view(), name='item-create'),
    path('item-create/<int:pk>', CreateItemView.as_view(), name='item-create'),
]

urls.py(auth_app)

from django.urls import path
from .views import (RegisterUserView, VerifyUserEmail, LoginUserView, 
PasswordResetRequestView, PasswordResetConfirmView, SetNewPasswordView,
LogoutView)


urlpatterns = [
    path('register/', RegisterUserView.as_view(), name='register'),
    path('verify-email/', VerifyUserEmail.as_view(), name='verify'),
    path('login/', LoginUserView.as_view(), name='login'),
    path('password-reset/', PasswordResetRequestView.as_view(), name='password-reset'),
    path('password-reset-confirm/<uidb64>/<token>/', PasswordResetConfirmView.as_view(), name='password-reset-confirm'),
    path('set-new-password/', SetNewPasswordView.as_view(), name='set-new-password'),
    path('logout/', LogoutView.as_view(), name='logout')
]

Авторизация и элементы в разных приложениях

Я не знаю, как выглядит ваш settings.py, но без кода ниже, authentication_classes не существует в вашем View.

REST_FRAMEWORK = {
    ...
    'DEFAULT_AUTHENTICATION_CLASSES': (
        ...
        'your authentication class path',
    )
    ...
}

Означает, что разрешение трудно получить.

Чтобы перейти к определенному разрешению, необходимо определить конкретного пользователя.

Однако, если класс аутентификации не существует, аутентифицированный пользователь также является анонимным пользователем.

Поэтому сначала нужно добавить authentication_classes в представление.

from .permissions import IsOnwerOrReadOnly

class CreateItemView(APIView):

   serializer_class = CreateItemSerializer
   permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsOnwerOrReadOnly]
   authentication_classes = [yourAuthenticationClass]

Далее, если вы посмотрите на permissions_classes, там установлены два класса разрешений.

Однако, как указано выше, два класса разрешений не работают при подключении к ','

Чтобы реализовать, когда разрешены оба класса разрешений или только один класс разрешений в классе разрешений DRF, вы можете использовать оператор bit в классе разрешений.

from .permissions import IsOnwerOrReadOnly

class CreateItemView(APIView):

   serializer_class = CreateItemSerializer
   permission_classes = [permissions.IsAuthenticatedOrReadOnly|IsOnwerOrReadOnly]
   # or(According to the your intention)
   permission_classes = [permissions.IsAuthenticatedOrReadOnly&IsOnwerOrReadOnly]

Класс DRF Permission разрешает битовые операции.

Вы можете обратиться к этой статье. Если вам интересно, как работают биты разрешения, обратитесь к этому исходному коду

Вернуться на верх