request.POST为Content-Type为空:multipart / form-data;边界= XYZZY

时间:2015-05-26 12:17:08

标签: django post request content-type

[已解决]请参阅我的回答。

发送的任何POST请求 Content-Type: multipart/form-data; boundary=xYzZY会导致request.POST QueryDict{}为空。将Content-Type更改为multipart/form-data也会导致相同的错误。

完全删除内容类型会导致值正确传递,我可以在request.POST中访问它们。

我尝试使用@csrf_exempt禁用Csrf中间件,并在多台服务器上尝试过相同的操作。没有改变空的POST条件。

在阅读Django框架和POST内容类型时,我读到它(不再)假设默认内容类型,因此必须提供正确的内容(我没有相关文章的链接) 。)我认为这里发生了类似的事情,django无法使用给定的内容类型解析参数(但是将其留空会让解析器用默认值解释它)。

我遇到的问题是,提供的Content-Type值是完全有效的(带有边界的multipart / form-data)。那么为什么django拒绝在POST字典中加载它?

**我无法控制POST数据中发送的Content-Type。

**更新:从request.body读取显示正在接收所有POST个参数。它们不会出现在request.POST

**更新:我使用Runscope来测试POST次请求。

2 个答案:

答案 0 :(得分:1)

UPDATE 中所述,我使用 Runscope 来测试POST数据。我意识到错误与Runscope处理multipart/form-data的方式有关。我通过支持提出了这个问题,并得知通知Runscope目前不支持multipart。我在这里复制了相关信息:

  

我们希望将来支持多部分表单上传功能,但是没有关于何时可用的时间表。一些客户通过将原始的多部分格式化主体或unicode字符串输入主体粘贴到请求中并确保包含适用的“内容类型”标头值,在其Radar测试(https://www.runscope.com/docs/radar)中完成了这项工作。正确的界限。可以在此处找到构建multipart / form-data POST请求的一些示例:http://chxo.com/be2/20050724_93bf.html

     

对于Runscope URL,多部分数据通过未经修改传递。但是,来自Traffic Inspector(https://www.runscope.com/docs/inspector)的请求编辑器和重试当前不支持多部分数据,这就是您的请求重试无效的原因。此外,在发送请求后,不会保存大于1 MB的请求和响应主体以供查看。

使用其他服务为我解决了这个问题。

答案 1 :(得分:0)

你(以某种方式)控制Content-Type。您正在寻找的是enctype。您可以按如下方式使用它:

<form method="POST" action="." enctype="multipart/form-data">
只有在您上传文件时才需要

enctype,否则就不会。