Джанго-OAuth-инструментарий; Django Rest Framework - учетные данные для аутентификации не предоставлены
Мой вопрос связан с этим и с этим, но с некоторыми существенными различиями: для первой ссылки: я использую 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 работает в первом примере, а не во втором? Это связано с парсерами или с чем-то еще? И как это исправить?
1 ответ
Ошибка в инструкции curl: по умолчанию ключевое слово токена django-oauth-toolkit - это не "Token", а "Bearer".
curl \
-vvv \
-X POST \
--form "file=@$FILE_NAME" \
--header "Authorization: Bearer $(cat token)" \
"$URL"
работает.