【问题标题】:Uploading Multiple Files using Django rest framework without using Forms使用 Django rest 框架上传多个文件而不使用表单
【发布时间】:2018-09-18 15:26:18
【问题描述】:

我正在尝试从 Postman 将多个文件发布到我的 django 应用程序。我没有使用表单,并且我的应用程序没有 UI 方面。这是我的视图类。

class FileUploader(APIView):
    '''
    Rest API for FileUploader
    '''
    permission_classes = (AllowAny,)
    parser_classes = (MultiPartParser, )

    @csrf_exempt
    def post(self, request):
        retval = Response(request.data, status=status.HTTP_201_CREATED)
        logger.info('New post with the following data: {}'.format(request.data))

它说,“TypeError: init() 缺少 3 个必需的位置参数:'META'、'input_data' 和 'upload_handlers'” 如果我使用 FormView,我的 Post 有三个键,两个代表文件,最后一个是字符串。在调试期间,我的请求没有字段 Data,并且 FILES 为空,并且 POST 没有任何信息。任何指针将不胜感激。如果有帮助,我可以上传更多。

这不是重复的,因为他能够上传多个文件而我的不上传任何文件。我正在努力弄清楚如何在请求中找到文件,并且由于它们不存在如何设置视图(而不是序列化)以接收多个文件。

enter image description here

【问题讨论】:

  • 此外,您没有从视图类返回任何响应
  • 我不关心从请求中生成模型,所以序列化不是问题的一部分,问题是物理 POST 请求。稍后在视图中,我返回响应 201 或依赖。我正在努力解决的是将两个文件都包含在请求中。
  • 添加了答案,试试吧

标签: django django-forms django-rest-framework django-views


【解决方案1】:

写一个视图类为

from rest_framework.views import APIView
from rest_framework.response import Response


class FileUploader(APIView):
    '''
    Rest API for FileUploader
    '''

    permission_classes = (AllowAny,)

    def post(self, request, *args, **kwargs):
        files_list = request.FILES
        data = request.data
        return Response(data={"files": "{} files uploaded".format(len(files_list)),
                              "data": "{} data included".format(len(data))})

并在 POSTMAN 中使用 form-data 发送

【讨论】:

  • 当我进行这些更改时,数据是一个字段,但 len 为 0,而 FILES 也为零。所以响应是 "{"files": "0 files Upload", "data": "0 data included"}
  • 您是如何添加文件和数据的?请截图
  • 刚刚添加截图
  • 并且表头是 Key = Content-Type Value = multipart/form-data
  • 删除标题并重试
【解决方案2】:

将上面的代码更改为如下所示,并在请求中包含标头'Content-Type': 'multipart/form-data'

class FileUploader(APIView):
    '''
    Rest API for FileUploader
    '''
    permission_classes = (AllowAny,)
    parser_classes = (MultiPartParser, )

    @csrf_exempt
    def post(self, request, *args, **kwargs):
        print(request.data)
        return Response({"message": "success"})

【讨论】:

  • 当我进行更改时,它说“AttributeError: 'NoneType' object has no attribute 'decode'”失败
猜你喜欢
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-18
  • 1970-01-01
  • 2015-10-04
  • 2013-12-26
  • 2016-10-25
相关资源
最近更新 更多