Представление работает только с 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. Попытались аутентифицировать пользователя?