2017-08-24 9 views
2

APIViewFooView)は、URLから直接アクセスできます。request.FILESプロパティが呼び出された場合、APIViewの中断要求がネストされます

APIViewAPIKeyImportViewファイル名に応じてFooViewを再利用する(これはAPIとの互換性のためにこのように行われます)。 request.FILESは、ファイル名を見てAPIKeyImportViewからアクセスされるしかし

request.FILESFooViewで空になります。

request.FILESにアクセスすると、ネストされたビューでは使用できなくなります。

方法はありますか? APIKeyImportViewrequest.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) 

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 modifying the request object

  • ジャンゴ1.9.5
  • ジャンゴ休止フレームワーク3.3.3
  • Python 3.4.2

答えて

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) 
関連する問題