django-oauth-工具包; Django Rest Framework - 未提供身份验证凭据
django-oauth-toolkit; Django Rest Framework - Authentication credentials were not provided
我的问题与 this one and 有关,但存在一些显着差异:对于第一个参考:我使用 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)
它的模型和序列化程序以及 urls 按预期工作。然而这个:
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'])
不像 returns {"detail":"Authentication credentials were not provided."}
代码 401。
有一个小细节,url 中的 "pk" 参数明确引用了来自其 url 指令的相应项目 ID: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/
。项目 ID 是有效的,因为使用 http://localhost:8000/<prefix>/projects/<project id>/
的 $URL 值和 GET 而不是 POST 并且没有 --form
选项进行测试。
为什么来自 oauth2 方案的 Bearer 令牌在第一个示例中有效,但在第二个示例中无效?它与解析器或其他东西有关吗?以及如何修复它?
错误在curl指令中:默认的django-oauth-toolkit token关键字不是"Token"而是"Bearer".
curl \
-vvv \
-X POST \
--form "file=@$FILE_NAME" \
--header "Authorization: Bearer $(cat token)" \
"$URL"
有效。
我的问题与 this one and
例如:
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)
它的模型和序列化程序以及 urls 按预期工作。然而这个:
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'])
不像 returns {"detail":"Authentication credentials were not provided."}
代码 401。
有一个小细节,url 中的 "pk" 参数明确引用了来自其 url 指令的相应项目 ID: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/
。项目 ID 是有效的,因为使用 http://localhost:8000/<prefix>/projects/<project id>/
的 $URL 值和 GET 而不是 POST 并且没有 --form
选项进行测试。
为什么来自 oauth2 方案的 Bearer 令牌在第一个示例中有效,但在第二个示例中无效?它与解析器或其他东西有关吗?以及如何修复它?
错误在curl指令中:默认的django-oauth-toolkit token关键字不是"Token"而是"Bearer".
curl \
-vvv \
-X POST \
--form "file=@$FILE_NAME" \
--header "Authorization: Bearer $(cat token)" \
"$URL"
有效。