request.FILES 清空 Django Rest Framework FileUploadParser 和 Angular 文件上传

request.FILES empty with Django Rest Framework FileUploadParser and Angular File upload

我有一个 angular 视图正在通过模板上传文件

Multiple
<input type="file" name="file" nv-file-select="" uploader="uploader" multiple  /><br/>

Single
<input type="file" name="file" nv-file-select="" uploader="uploader" />

控制器使用 angular 上传库 (https://github.com/nervgh/angular-file-upload)

UploadController.$inject = ['$scope', 'FileUploader'];

 /**
 * @namespace UploadController
 */
 function UploadController($scope, FileUploader) {
   $scope.uploader = new FileUploader();
   $scope.uploader.url = 'api/v1/data/import/'
   $scope.uploader.method = 'PUT'

 };

在服务器端,请求使其成为视图中的正确方法class

class FileUploadView(views.APIView):

   parser_classes = (FileUploadParser,)

   def put(self, request, format=None):

     file_obj = request.FILES['file']
     # ...
     # do some staff with uploaded file
     # ...
     return Response(status=204)

然而创建的字典是空的

request.FILES['file']
(Pdb) *** django.utils.datastructures.MultiValueDictKeyError: "'file'"

看起来 FileUploadParser 中内置了解析异常,但不是 运行 并且我正在通过网络发送正确类型的请求。为什么没有办法告诉为什么这个请求没有被正确解析?我错过了什么?

首先确保你知道request.filesrequest.FILES之间的区别。前者用于 Django Rest Framework 2.x,后者用于 Django Rest Framework 3。至于空字典,由于某种原因 FileUploadParser 没有正确解析它,而是将解析器切换为 MultipartParser成功了。请求中的 enctype 是多部分的,因此可能与它有关。