Представление работает только с permissions.AllowAny и authentication_classes = []

Итак, я новичок в Django и DRF, поэтому, возможно, я делаю что-то очень глупое. Я делаю приложение react, обслуживаемое из Django и использую Django Rest Framework для создания API для управления базой данных. Я настроил API с аутентификацией сеанса. В основном все работает нормально, я могу входить и выходить, регистрировать пользователя. Я могу делать post-запросы, за исключением одного представления, которое я использую для создания объекта и добавления его в базу данных PostgreSQL. Пример кода чуть ниже этого абзаца - единственный способ, которым я могу заставить его работать, что не идеально. Если кто-то может хотя бы просто указать мне общее направление, даже если вы не знаете точно, что происходит, это было бы замечательно, потому что я полностью потерян здесь. Спасибо

class StationCreate(generics.CreateAPIView):
    
    authentication_classes = []
    permission_classes = (permissions.AllowAny,)
    
    queryset = Station.objects.all(),
    serializer_class = StationSerializer

Это работает так, потому что нет аутентификации и разрешения AllowAny. Это, конечно, не хорошо, поэтому я пытаюсь добавить:

permission_classes = [DjangoModelPermissions,]

и удалить:

authentication_classes = []

Затем я зашел в панель администратора и убедился, что мой пользователь настроен на использование всех прав пользователя, но когда я запускаю свое приложение, я получаю ошибку 403 в браузере и на терминале сервера:

[21/Aug/2022 21:22:12] "POST /api/create/ HTTP/1.1" 403 45
Forbidden: /api/create/

Браузер:

Status            403 Forbidden
Version           HTTP/2
Transferred       469 B (45 B size)
Referrer Policy   same-origin

Также, возможно, это не относится к делу, но при использовании ссылки https://localhost:8000/api/create' в браузере, чтобы попробовать создать запись в Django UI, она выдает ошибку 'tuple' object has no attribute 'model'.

AttributeError at /api/create/
'tuple' object has no attribute 'model'
Request Method:     GET
Request URL:        http://localhost:8000/api/create/
Django Version:     4.1
Exception Type:     AttributeError
Exception Value:    'tuple' object has no attribute 'model'

Exception Location:     /workspace/ci-4-blugold/venv/lib/python3.8/site-packages/rest_framework/permissions.py, line 230, in has_permission
Raised during:  blugold.views.StationCreate
Python Executable:  /workspace/ci-4-blugold/venv/bin/python
Python Version:     3.8.13
Python Path:    

['/workspace/ci-4-blugold',
 '/home/gitpod/.pyenv/versions/3.8.13/lib/python38.zip',
 '/home/gitpod/.pyenv/versions/3.8.13/lib/python3.8',
 '/home/gitpod/.pyenv/versions/3.8.13/lib/python3.8/lib-dynload',
 '/workspace/ci-4-blugold/venv/lib/python3.8/site-packages']

Server time:    Sun, 21 Aug 2022 21:22:28 +0000

Я не получаю эту ошибку, когда удаляю permission_classes = [DjangoModelPermissions,]

urls.py:

from django.urls import include, path
from .views import StationCreate, StationList, StationDetail, StationUpdate, StationDelete, ExternalApiRequest


urlpatterns = [
    path('', StationList.as_view()),
    path('<int:pk>/', StationDetail.as_view(), name='retrieve-station'),
    path('update/<int:pk>/', StationUpdate.as_view(), name='update-station'),
    path('delete/<int:pk>/', StationDelete.as_view(), name='delete-station'),
    path('create/', StationCreate.as_view(), name='create-fulesprices'),
]

models.py:

from django.db import models

class Station(models.Model):
    station = models.CharField("Name", max_length=240)
    petrol = models.CharField("Petrol", max_length=240)
    diesel = models.CharField("Diesel", max_length=240)
    google_id = models.CharField("Google Id", max_length=240)
    updated = models.DateField(auto_now_add=True)

    def __str__(self):
        return self.name
<

Согласно документации, чтобы использовать класс DjangoModelPermissions, вы должны убедиться, что вы аутентифицированы. В противном случае вы не сможете получить доступ к API и получите ошибку unauthorized. Попытались аутентифицировать пользователя?

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