我正在使用python请求模块对网站进行一些测试。
请求模块允许您通过传入键设置为无的字典来删除某些标题。例如
headers = {u'User-Agent': None}
将确保没有与请求一起发送用户代理。
然而,似乎当我发布数据时,请求将为我计算正确的Content-Length,即使我指定None或不正确的值。例如
headers = {u'Content-Length': u'999'}
headers = {u'Content-Length': None}
我检查请求中使用的标头的响应(response.request.headers),我可以看到Content-Length已经重新添加了正确的值。到目前为止,我看不到任何方法来禁用此行为
CaseInsensitiveDict({'Content-Length': '39', 'Content-Type': 'application/x-www-form-urlencoded', 'Accept-Encoding': 'gzip, deflate, compress', 'Accept': '*/*', 'User-Agent': 'python-requests/2.2.1 CPython/2.7.6 Linux/3.13.0-36-generic'})
我真的很想继续使用请求模块来执行此操作。这可能吗?
答案 0 :(得分:10)
您必须prepare the request manually,然后删除生成的内容长度标题:
from requests import Request, Session
s = Session()
req = Request('POST', url, data=data)
prepped = req.prepare()
del prepped.headers['content-length']
response = s.send(prepped)
请注意,大多数兼容的HTTP服务器可能会忽略您的帖子!
如果您打算使用chunked transfer encoding(您不必发送内容长度),请使用data
参数的迭代器。请参阅文档中的Chunked-Encoded Requests。在这种情况下,不会设置Content-Length
标头。