request.post的头字段可以是unicode对象吗?

时间:2016-06-06 13:28:39

标签: python unicode python-requests

我正在使用python请求2.2.1,并尝试使用自定义标头发布请求。

我正在创建自己的标题myheader,如下所示:

myheader = {'name' : myvalue }

事情是myvalue是一个unicode对象。我没有将它编码为字节字符串,只是将其直接放在myheader字典中。

当我这样做时:

r = requests.post(myhost, headers=myheader)

我得到一个例外:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 17-18: ordinal not in range(128)

我想我可以通过myvalue.encode('utf8')将它放入header词典中来摆脱它 - 但我的问题是,将unicode对象放入标题是不合法的吗?我问,因为响应可以包含没有问题的unicode对象,为什么我不能在标题中放一个?

1 个答案:

答案 0 :(得分:1)

标题是 unicode数据,没有。它们不是POST主体的一部分(根据需要为您编码,否则可以包含任何二进制数据)。

绝大多数HTTP标头编码的信息只需要ASCII字符集 。例如,Accept-Language标头仅包含ISO-639语言代码,可选的ISO-3166国家/地区代码,以及q;=和数字信息。

通常认为HTTP标头可能也包含Latin-1(ISO-8859-1)字符(因此最多为Unicode U + 00FF);特别是HTTP 1.1 Warning header specification使用Latin-1作为默认值。如果您需要在Latin-1范围之外的标题中对文本进行编码,请对RFC 2047之后的文本进行编码。在Python中,您可以使用email.header.Header() objects

执行此操作
from email.header import Header

myheader = {'name': str(Header(u'Some unicode value', 'utf-8'))}