我的问题与
this one
和
this one
但是对于一些重要的区别:对于第一个引用:我使用django oauth工具包,尽管与第二个引用不同,用户必须经过身份验证,因为这不是注册端点,而是上载端点。我已经用相同的设置成功地在同一个应用程序中实现了其他端点,并且它工作正常。
例如:
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。
url中的“pk”参数显式引用其url指令中的相应项目id,这是一个小细节:
path('projects/<uuid:pk>/upload/', views.uploadView.as_view(), name='upload'),
是的。但除此之外,据我所知,唯一的区别是解析器类。
如果可以,我使用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值测试,项目id有效
http://localhost:8000/<prefix>/projects/<project id>/
用get代替post不
--form
选择。
为什么oauth2方案中的承载令牌在第一个示例中有效,但在第二个示例中无效?是和解析器有关还是别的什么?怎么解决呢?