Python:request.has_header(header)总是返回false

时间:2017-01-18 22:44:41

标签: python http web urllib

使用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请求包括没有标题但是......肯定不会是这种情况?

感谢您的任何见解!

3 个答案:

答案 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

不要问我为什么这样做。我不知道。