"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 разрешает битовые операции.
Вы можете обратиться к этой статье. Если вам интересно, как работают биты разрешения, обратитесь к этому исходному коду