当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python Django Client.post用法及代码示例


本文介绍 django.test.Client.post 的用法。

声明

post(path, data=None, content_type=MULTIPART_CONTENT, follow=False, secure=False, **extra)

对提供的 path 发出 POST 请求并返回 Response 对象,如下所述。

data 字典中的键值对用于提交 POST 数据。例如:

>>> c = Client()
>>> c.post('/login/', {'name': 'fred', 'passwd': 'secret'})

…将导致评估对此 URL 的 POST 请求:

/login/

…使用此 POST 数据:

name=fred&passwd=secret

如果您将 content_type 提供为 application/json ,则如果 data 是字典、列表或元组,则使用 json.dumps() 对其进行序列化。默认情况下,使用 DjangoJSONEncoder 执行序列化,并且可以通过向 Client 提供 json_encoder 参数来覆盖。此序列化也发生在 put() patch() delete() 请求中。

如果您提供任何其他 content_type(例如,text/xml 用于 XML 有效负载),data 的内容将在 POST 请求中按原样发送,使用 HTTP Content-Type 标头中的 content_type

如果您没有为 content_type 提供值,则 data 中的值将以 multipart/form-data 的内容类型传输。在这种情况下,data 中的键值对将被编码为多部分消息并用于创建 POST 数据有效负载。

要为给定键提交多个值 - 例如,指定 <select multiple> 的选择 - 将值作为所需键的列表或元组提供。例如,这个 data 的值将为名为 choices 的字段提交三个选定的值:

{'choices': ('a', 'b', 'd')}

提交文件是一种特殊情况。要发布文件,您只需提供文件字段名称作为键,并提供要上传的文件的文件句柄作为值。例如:

>>> c = Client()
>>> with open('wishlist.doc', 'rb') as fp:
...     c.post('/customers/wishes/', {'name': 'fred', 'attachment': fp})

(此处的名称attachment 不相关;使用您的file-processing 代码期望的任何名称。)

您还可以提供任何 file-like 对象(例如 StringIO BytesIO )作为文件句柄。如果您要上传到 ImageField ,则该对象需要一个通过 validate_image_file_extension 验证器的 name 属性。例如:

>>> from io import BytesIO
>>> img = BytesIO(b'mybinarydata')
>>> img.name = 'myimage.jpg'

请注意,如果您希望对多个post() 调用使用相同的文件句柄,则需要手动重置帖子之间的文件指针。执行此操作的最简单方法是在将文件提供给 post() 后手动关闭文件,如上所示。

您还应该确保以允许读取数据的方式打开文件。如果您的文件包含图像等二进制数据,这意味着您需要以rb(读取二进制)模式打开文件。

extra 参数的作用与 Client.get() 相同。

如果您使用 POST 请求的 URL 包含编码参数,则这些参数将在 request.GET 数据中可用。例如,如果您要提出请求:

>>> c.post('/login/?visitor=true', {'name': 'fred', 'passwd': 'secret'})

... 处理此请求的视图可以询问 request.POST 以检索用户名和密码,并可以询问 request.GET 以确定用户是否是访问者。

如果您将follow 设置为True,则客户端将遵循任何重定向,并且将在包含中间url 和状态代码的元组的响应对象中设置redirect_chain 属性。

如果将 secure 设置为 True,客户端将模拟 HTTPS 请求。

相关用法


注:本文由纯净天空筛选整理自djangoproject.com大神的英文原创作品 django.test.Client.post。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。