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

6
每个multipart/form-data文档中的部分都可以有自己的标题,例如,一个部分可以有一个标题Content-Type: text/plain。这些部分可以是来自Web表单的上传文件,例如。
Django的UploadedFile类的文档中,我读到:

UploadedFile.content_type

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

好的,我应该根据所声称的内容类型验证文件。因此,现在我需要编写一些测试来测试我的服务器是否正确地验证内容类型。其中一个测试是向我的服务器发出一个请求,其中content-type: multipart/form-data,其中至少一个部分的内容与其内容类型不一致。
我该怎么做?Django.test.Client类有一个post方法,可以发送带有类型multipart/form-data的请求。请求正文的多个部分被作为字典传递给该方法。该字典的键是字符串,值是字符串或“文件对象”。
我希望了解:
  1. 如何将该字典转换为multipart/form-data请求正文。每个部分的标头是什么?
  2. 如何在每个部分上手动设置任意标头。例如,我如何手动指定一个标题Content-Type: text/plain
2个回答

4
  1. Django测试套件声称它将始终为文件使用application/octet-stream头。但实际上,使用的encode_file函数会尝试猜测文件的实际MIME类型。
  2. 这导致了对第二个问题的回答:在尝试猜测MIME类型之前,该函数查找文件上的content_type属性。您应该能够将其设置为任何您喜欢的内容,并因此覆盖Content-Type

这是答案;这很有用。不过,在有人能指导我使用文档记录的Django API来完成我需要的工作之前,我将保持未核对状态。 - jameshfisher
我一直在寻找,但是没有找到 :(。可能是因为我没有努力寻找......不管怎样,谢谢! - Martijn Arts

2
Client 类继承自 django.test.client.RequestFactorysrc),你可以在 Clientpost 定义中看到它基本上是对 super 的调用,因此你可以参考 RequestFactory post definition 。默认情况下,这会调用 _encode_data,它使用 encode_multipart,正如你所注意到的那样,它指定了 "multipart/form-data"。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接