Мой вопрос связан с этим и этим , но с некоторыми существенными отличиями: для первой ссылки: я использую django-oauth-toolkit, хотя в отличие от второй ссылки, Пользователь ДОЛЖЕН быть аутентифицирован, поскольку это не конечная точка регистрации, а конечная точка загрузки. Я успешно реализовал другие конечные точки в том же приложении с той же настройкой, и она работает надлежащим образом.
Например:
class projectsView(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Project.objects.all()
serializer_class = ProjectSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
и его модель, сериализатор и URL работают как положено. Однако этот:
class uploadView(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = FileUpload.objects.all()
parser_classes = (MultiPartParser, FormParser,) #(FileUploadParser,)
serializer_class = FileUploadSerializer
def post(self, request, *args, **kwargs):
print(request.data['file'])
return self.create(request, *args, **kwargs)
def perform_create(self, serializer):
serializer.save(owner=self.request.user, project_id=self.kwargs['pk'],
file=self.request.data['file'])
Не так, как возвращает {"detail":"Authentication credentials were not provided."}
с кодом 401.
Есть небольшая деталь, что параметр "pk" из url явно указывает на соответствующий идентификатор проекта из инструкции url: path('projects/<uuid:pk>/upload/', views.uploadView.as_view(), name='upload'),
. Но кроме этого, насколько я могу судить, единственное отличие - это parser_classes.
Я использую curl для локального тестирования на моем компьютере, если это работает, и вот инструкция curl:
curl \
-vvv \
-X POST \
--form "file=@$FILE_NAME" \
--header "Authorization: Token $(cat token)" \
"$URL"
Где $FILE_NAME
- это файл Excel в этом случае, а $URL
имеет значение http://localhost:8000/<prefix>/projects/<project id>/upload/
. Идентификатор проекта действителен в соответствии с тестом со значением $ URL http://localhost:8000/<prefix>/projects/<project id>/
с GET вместо POST и без опции --form
.
Почему токен Bearer из схемы oauth2 работает в первом примере, а не во втором? Это связано с парсерами или с чем-то еще? И как это исправить?