UnicodeError Python 3请求(&A) [英] UnicodeError Python 3 & Requests

查看:28
本文介绍了UnicodeError Python 3请求(&A)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我以前在Python2.7中使用过请求,从来没有遇到过这个问题。现在我正在用Python3编写代码,它甚至无法连接到服务器。

我一直收到错误: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)

我读过它与URL在连接到服务器之前的Idna编码有关。

有人知道如何解决此问题吗?

编辑: 我已经找到了解决方案,而不是在URL中传递apikey&;代码。我可以在报头中将其作为HTTPBasicAuth传递。则URL更改为"http://SHOP.ECOMMERCE.com/admin/"并且Idna不再出现任何问题。

推荐答案

根据报告(打开!)在Python tracker issue 32958中,这里的问题是Python3中的requests现在将URL传递给idna.py(与Python2不同)。

idna.py尝试在将主机名传递给socket.gethostbyname()之前对其进行健全性检查。它通过首先检查名称的第一个组件(或可能是每个组件)的长度是否少于64个字符来实现此目的。

(主机名的每个以点分隔的组件-在RFC 1035中称为";labels";)都有长度限制。因此,检查背后的想法是正确的,因为根据标准,主机名组件长度超过64个字符是无效的。):

标签必须遵循ARPANET主机名的规则。他们必须 以字母开头,以字母或数字结尾,作为内部 仅包含字母、数字和连字符。还有一些 对长度的限制。标签不能超过63个字符。

遗憾的是,当idna.py检查主机名长度时,它包括从协议分隔符到第一个.字符的所有内容,包括URL中指定的任何基本-auth参数。

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

这篇关于UnicodeError Python 3请求(&A)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆