使用python 3.6中的urllib,我创建了一个请求并应用了标头。但是,当我运行
时,Python似乎完全忽略了该指令req.has_header('Content-Type')
结果是假的。除了' Connection'之外,这也适用于其他标题。有趣的是,'连接'也返回false。我无法找到一个很好的资源来确定在Python中声明头文件是如何精确地工作(并且Python显然对标题名称非常区分大小写),所以如果有人有任何建议我会感兴趣听到他们的声音!
我的相关来源是:
head = {
'content-type': 'application/x-www-form-urlencoded',
'connection': 'keep-alive',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
}
req = Request(url, post_bytes, head)
print(req.has_header('content-type')
替代'内容类型'对于任何其他给定的标题,结果仍然是错误的。它几乎像默认的python请求包括没有标题但是......肯定不会是这种情况?
感谢您的任何见解!
答案 0 :(得分:3)
您是否尝试过(请注意'类型'是小写):
req.has_header('Content-type')
如果使用req.header_items(),则可以看到标题键的首字母大写(并且只有第一个字母大写)。
答案 1 :(得分:2)
标头不匹配不区分大小写。标题被标准化为大写字符串(首字母大写,其余为小写),因此对Content-type
的测试有效:
>>> list(req.headers)
['Content-type', 'Connection', 'User-agent']
>>> req.has_header('Content-type')
True
是的,这过于简单,但足以在模块中内部使用标头。
答案 2 :(得分:0)
检查出来:
<强> urllib2.py 强>
def add_header(self, key, val):
# useful for something like authentication
self.headers[key.capitalize()] = val
现在,因为设置标题与在每个标题上调用add_header
相同,您可以看到正在发生的事情是urllib将每个键大写。因此,您的标题恰好在此键下可用:Content-type
。
不要问我为什么这样做。我不知道。