我之前使用过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不再提出任何问题。
答案 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参数。