如何使用django.test.Client设置multipart / form-data部分的标题?

时间:2015-03-23 15:32:51

标签: python django multipartform-data django-testing

multipart/form-data文档中的每个部分都可以拥有自己的标题,例如一个部分可以有一个标题Content-Type: text/plain。例如,这些部分可以从Web表单上传文件。

the documentation for Django's UploadedFile class中,我读了

  

UploadedFile.content_type

     

随文件一起上传的内容类型标题(例如text / plain或application / pdf)。与用户提供的任何数据一样,您不应相信上传的文件实际上是此类型。您仍然需要验证该文件是否包含内容类型标头声明的内容 - “信任但验证。”

好的,我应该根据声明的内容类型验证文件。所以当然,现在我需要编写一些测试来测试我的服务器是否确实正确验证了内容类型。其中一个测试是使用content-type: multipart/form-data向我的服务器发出请求,其中至少有一个部分的内容与其内容类型不一致。

我该怎么做? The django.test.Client class has a post method,可以发送类型为multipart/form-data的请求。请求主体的多个部分作为字典传递给方法。这个字典的键是字符串,值是字符串或“文件对象”。

我希望了解:

  1. 如何将此词典转换为multipart/form-data请求正文。每个部分的标题是什么?
  2. 如何在每个部件上手动设置任意标头。例如,我如何手动指定标题Content-Type: text/plain

2 个答案:

答案 0 :(得分:4)

  1. Django测试套件claims它总是使用application/octet-stream标头来存档。但事实并非如此,因为encode_file函数实际上试图guess文件的实际mimetype。
  2. 这导致您对第二个问题的回答:在尝试猜测mimetype之前,文件中的函数looks forcontent_type属性。您应该能够将其设置为您喜欢的任何内容,从而覆盖Content-Type

答案 1 :(得分:2)

Client类继承自django.test.client.RequestFactorysrc)并且有效,您可以在Client post定义中看到它& #39; s基本上是对super的调用,因此您可以参考RequestFactory post definition。默认情况下,这会依次调用使用_encode_dataencode_multipart,正如您所注意到的那样,它指定" multipart / form-data"。

在这里,您可以看到为每个部分指定了一些标题(例如Content-Disposition),但我没有看到为每个部分指定Content-Type标题(或任何特定标题)的方法。