Django 如果调用request.FILES属性,嵌套APIView将中断请求
我们有一个Django 如果调用request.FILES属性,嵌套APIView将中断请求,django,debugging,request,django-rest-framework,Django,Debugging,Request,Django Rest Framework,我们有一个APIView(FooView)可以通过URL直接访问 我们还有另一个APIViewAPIKeyImportView,它将根据文件名重用FooView(这样做是为了与API兼容) 但是,当从APIKeyImportView访问request.FILES以查看文件名时,request.FILES在FooView中变为空 访问request.FILES会使嵌套视图无法使用它 有办法解决这个问题吗 class FooView(APIView): permission_clas
APIView
(FooView
)可以通过URL直接访问
我们还有另一个APIView
APIKeyImportView
,它将根据文件名重用FooView
(这样做是为了与API兼容)
但是,当从APIKeyImportView
访问request.FILES
以查看文件名时,request.FILES
在FooView
中变为空
访问request.FILES
会使嵌套视图无法使用它
有办法解决这个问题吗
class FooView(APIView):
permission_classes = (permissions.IsAuthenticated,)
def post(self, request, vendor):
file = request.FILES.get('file')
if not file:
return Response(status=status.HTTP_400_BAD_REQUEST)
return Response()
class APIKeyImportView(APIView):
permission_classes = (permissions.IsAuthenticated,)
authentication_classes = (ApiKeyAuthentication,)
def post(self, request):
file = request.FILES.get('file')
if not file:
return Response(status=status.HTTP_400_BAD_REQUEST)
name = file.name
if name.startswith('FOO'):
return FooView.as_view()(request=request)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)
在APIKeyImportView
中删除对request.Files
的验证将使其在FooView
中可访问,但它有点忽略了要点
在PyCharm中检查request
,也会使其在FooView
中不可用,因为调试器将调用属性
class APIKeyImportView(APIView):
permission_classes = (permissions.IsAuthenticated,)
authentication_classes = (ApiKeyAuthentication,)
def post(self, request):
return FooView.as_view()(request=request)
这些解决方案不起作用:
在以下版本上进行了测试:
- Django 1.9.5
- django rest框架3.3.3
- Python 3.4.2
request.FILES
,但我不确定它是否有副作用
class FooView(APIView):
permission_classes = (permissions.IsAuthenticated,)
_files = None
@property
def request_files(self):
if self._files:
return self._files
return self.request.FILES
def post(self, request, vendor):
file = self.request_files.get('file')
if not file:
return Response(status=status.HTTP_400_BAD_REQUEST)
return Response()
class APIKeyImportView(APIView):
permission_classes = (permissions.IsAuthenticated,)
authentication_classes = (ApiKeyAuthentication,)
def post(self, request):
file = request.FILES.get('file')
if not file:
return Response(status=status.HTTP_400_BAD_REQUEST)
name = file.name
if name.startswith('FOO'):
# Passing FILES here
return FooView.as_view(_files=request.FILES)(request=request)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)