request.FILES为空,使用Django Rest Framework FileUploadParser和Angular File上传

时间:2015-02-11 22:40:39

标签: javascript django angularjs django-rest-framework

我有一个通过模板上传文件的角度视图

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

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

和控制器使用角度上传库(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'

 };

在服务器端,请求使其成为View类

中的正确方法
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)

但是创建的Dict是空的

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

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

1 个答案:

答案 0 :(得分:1)

首先请确保您了解request.filesrequest.FILES之间的区别。前者用于Django Rest Framework 2.x,后者用于Django Rest Framework 3.由于某些原因FileUploadParser没有正确解析它,但将解析器切换为MultipartParser特技。请求中的enctype是多部分的,因此可能与它有关。