【问题标题】:UnicodeError Python 3 & RequestsUnicodeError Python 3 和请求
【发布时间】:2017-01-24 14:47:21
【问题描述】:

我之前在 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)

我读过它与连接到服务器之前的 url 的 IDNA 编码有关。

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

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

【问题讨论】:

  • 您使用的是什么版本的请求?
  • python 3.6 & 请求 2.12.4
  • 编辑:刚更新到2.13.0,可惜没有解决问题。
  • 对于任何在这里绊倒的人。我不确定为什么 Requests lib 会如此严格地执行此操作。我在源代码中寻找了一个简单的解决方法,但没有运气。因此,这是要发送的标头(因为上面没有明确提及)。 headers = { 'Authorization': SHOPIFY_KEY, 'X-Shopify-Access-Token': SHOPIFY_PASSWORD,} 以上对我有用。 Shopify 文档目前和往常一样,在标题和所有内容的主题上都有错误和拼写错误。 #就业保障。好的平台,没有帮助的支持。

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


【解决方案1】:

根据Python tracker issue 32958 的报告(仍然打开!),这里的问题是 Python 3 中的 requests 现在将 URL 传递给 idna.py(与 Python 2 相比有所变化)。

idna.py 尝试在将主机名传递给socket.gethostbyname() 之前对其进行完整性检查。它首先检查名称的第一个组成部分(或者可能是每个组成部分)的长度是否小于 64 个字符。

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

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

不幸的是,当idna.py 检查主机名长度时,它包括从协议分隔符到第一个. 字符的所有内容 — 包括任何基本身份验证参数在 URL 中指定。

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

【讨论】:

    【解决方案2】:

    我找到了解决方案,而不是在 URL 中传递 APIKEY & CODE。我可以将它作为 HTTPBasicAuth 在标头中传递。网址更改为“http://SHOP.ECOMMERCE.com/admin/”之后,IDNA 不再出现任何问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      相关资源
      最近更新 更多