UnicodeError Python 3&要求

时间:2017-01-24 14:47:21

标签: python-3.x python-requests shopify

我之前使用过Python 2.7的请求,我从来没有遇到过这个问题。现在我在Python 3中进行编码,它甚至无法连接到服务器。

我一直收到错误:UnicodeError: label empty or too long

用于说明目的的简化代码:

shop_url = "https://APIKEY:CODE@SHOP.ECOMMERCE.com/admin/"

def get_products():
    url = shop_url + "products.json"
    r = requests.get(url=url, params={"limit": "250"})
    response = r.json()
    print(response)

我已经读过,它在连接到服务器之前与网址的IDNA编码有关。

有谁知道如何解决这个问题?

编辑: 我找到了解决方案,而不是通过APIKEY& URL中的CODE。我可以将其作为HTTPBasicAuth传递到标头中。比网址更改为"http://SHOP.ECOMMERCE.com/admin/",IDNA不再提出任何问题。

2 个答案:

答案 0 :(得分:0)

我找到了解决方案,而不是通过APIKEY& URL中的CODE。我可以将其作为HTTPBasicAuth传递到标头中。比网址更改为" http://SHOP.ECOMMERCE.com/admin/"和IDNA不再提出任何问题。

答案 1 :(得分:0)

根据Python tracker issue 32958上的报告( still 打开!),这里的问题在于,Python 3中的requests现在将URL传递给idna.py(a从Python 2更改)。

idna.py尝试对主机名进行完整性检查,然后再将其传递给socket.gethostbyname()。首先检查名称的第一个组成部分(或每个组成部分)的长度是否少于64个字符。

(主机名的每个点分隔成分(在RFC 1035中称为“标签”)都有长度限制。因此,支票后面的 idea 是一个合理的名称,因为主机名超过64个字符的组件根据标准是无效的。):

标签必须遵循ARPANET主机名的规则。他们一定 以字母开头,以字母或数字结尾,并作为内部 字符只能是字母,数字和连字符。也有一些 长度的限制。标签不得超过63个字符。

不幸的是,当idna.py检查主机名长度时,它包括从协议分隔符到第一个.字符的 一切 -包括任何URL中指定的basic-auth参数。

您已经发现,解决方法是在请求标头中提供auth参数。