後世のために、完全なトレースバックはこれです:
>>> requests.get(base_url)
Traceback (most recent call last):
File "/Users/cory/.pyenv/versions/3.6.0/lib/python3.6/encodings/idna.py", line 165, in encode
raise UnicodeError("label empty or too long")
UnicodeError: label empty or too long
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/cory/Documents/Python/requests_org/requests/requests/api.py", line 72, in get
return request('get', url, params=params, **kwargs)
File "/Users/cory/Documents/Python/requests_org/requests/requests/api.py", line 58, in request
return session.request(method=method, url=url, **kwargs)
File "/Users/cory/Documents/Python/requests_org/requests/requests/sessions.py", line 493, in request
prep.url, proxies, stream, verify, cert
File "/Users/cory/Documents/Python/requests_org/requests/requests/sessions.py", line 666, in merge_environment_settings
env_proxies = get_environ_proxies(url, no_proxy=no_proxy)
File "/Users/cory/Documents/Python/requests_org/requests/requests/utils.py", line 692, in get_environ_proxies
if should_bypass_proxies(url, no_proxy=no_proxy):
File "/Users/cory/Documents/Python/requests_org/requests/requests/utils.py", line 676, in should_bypass_proxies
bypass = proxy_bypass(netloc)
File "/Users/cory/.pyenv/versions/3.6.0/lib/python3.6/urllib/request.py", line 2616, in proxy_bypass
return proxy_bypass_macosx_sysconf(host)
File "/Users/cory/.pyenv/versions/3.6.0/lib/python3.6/urllib/request.py", line 2593, in proxy_bypass_macosx_sysconf
return _proxy_bypass_macosx_sysconf(host, proxy_settings)
File "/Users/cory/.pyenv/versions/3.6.0/lib/python3.6/urllib/request.py", line 2566, in _proxy_bypass_macosx_sysconf
hostIP = socket.gethostbyname(hostonly)
UnicodeError: encoding with 'idna' codec failed (UnicodeError: label empty or too long)
これについて私たちにできることはあまりないと思います。 エラーは標準ライブラリ(具体的には、urllib proxy_bypass
関数)から発生しています。 これはPython3にのみ存在し、 socket.gethostbyname
を呼び出す必要があると感じています。 この関数は、ユニコードホスト名を自動的にIDNAエンコードします。このような状況では、それが単に必要ではなく、そのIDNAエンコーダーがこれを正しく拒否します。
これを修正できる唯一の方法は、何らかの形式でURLを正規化するはるかにスマートなURL処理実装に移行することです。 最適な候補はハイパーリンクですが、同様の理由でハイパーリンクもこれを無効にします(IDNAエンコードを試みて失敗します)。
これは、せいぜいURLホストノーマライザーでハイパーリンクを拡張して処理することでこれを修正できることを意味します。 ただし、WHATWG URL仕様でも、この形式のURLは禁止されているようです。 もしそうなら、Chromeがそれを正規化するので(Safariはそうではありませんが)、理由はわかりません。
これを行うために必要な作業量を考えると、それを容認する理由はありません。 URLは、合理的に機能すると予想されるものから見事に遠く離れているため、修正されないため、これを閉じる傾向があります。
@johnpaulhayesこれはまだリクエストライブラリの問題ではありませんが、私もそれに遭遇しているので、更新を削除すると思います。
それを行うように見えるのはURLの全長ではなく、その一部にすぎません。 ホスト名の最初の部分の長さが64文字を超えると、IDNAエンコーダーがURLで機能しなくなるようです。 どういうわけか、そこには鍵と秘密も含まれています。 したがって、基礎となる関数が修正されるまで、python3を回避するか、長い " key:secret @ example "文字列を回避します(おそらく長いAPIキーを回避することによって)。 昨日、Pythonトラッカーにバグを提出しました。
Python側の問題に興味のある人のために
https://bugs.python.org/issue32958
最も参考になるコメント
Python側の問題に興味のある人のために
https://bugs.python.org/issue32958