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)