やあ、
リクエスト2.11以降、アプリのリクエストを使用したすべての通話が中断されます。 デバッグ後、このバージョンは以前のように整数値のヘッダーを受け入れないようです。
2.10:
In [1]: import requests
In [2]: requests.get('http://bing.com', headers={'Content-Length': 42})
Out[2]: <Response [200]>
2.11
In [1]: import requests
In [2]: requests.get('http://bing.com', headers={'Content-Length': 42})
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\utils.py in check_header_validity(header)
751 try:
--> 752 if not pat.match(value):
753 raise InvalidHeader("Invalid return character or leading space in header: %s" % name)
TypeError: expected string or bytes-like object
During handling of the above exception, another exception occurred:
InvalidHeader Traceback (most recent call last)
<ipython-input-2-ae7ec2933e34> in <module>()
----> 1 requests.get('http://bing.com', headers={'Content-Length': 42})
D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\api.py in get(url, params, **kwargs)
68
69 kwargs.setdefault('allow_redirects', True)
---> 70 return request('get', url, params=params, **kwargs)
71
72
D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\api.py in request(method, url, **kwargs)
54 # cases, and look like a memory leak in others.
55 with sessions.Session() as session:
---> 56 return session.request(method=method, url=url, **kwargs)
57
58
D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
455 hooks = hooks,
456 )
--> 457 prep = self.prepare_request(req)
458
459 proxies = proxies or {}
D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\sessions.py in prepare_request(self, request)
388 auth=merge_setting(auth, self.auth),
389 cookies=merged_cookies,
--> 390 hooks=merge_hooks(request.hooks, self.hooks),
391 )
392 return p
D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\models.py in prepare(self, method, url, headers, files, data, params, auth, cookies, hooks, json)
293 self.prepare_method(method)
294 self.prepare_url(url, params)
--> 295 self.prepare_headers(headers)
296 self.prepare_cookies(cookies)
297 self.prepare_body(data, files, json)
D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\models.py in prepare_headers(self, headers)
407 for header in headers.items():
408 # Raise exception on invalid header value.
--> 409 check_header_validity(header)
410 name, value = header
411 self.headers[to_native_string(name)] = value
D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\utils.py in check_header_validity(header)
754 except TypeError:
755 raise InvalidHeader("Header value %s must be of type str or bytes, "
--> 756 "not %s" % (value, type(value)))
757
758
InvalidHeader: Header value 42 must be of type str or bytes, not <class 'int'>
各リクエストで「Content-Length」を定義します。 とにかく、意味的に整数であるヘッダーに整数を使用することは意味がありませんか?
残念ながら、ヘッダー値の非文字列は、Requestsを使用するための受け入れられた方法ではありませんでした。以前のバージョンでは許可されていましたが、その後、許可しない変更を加えました。 これは主に、ヘッダーが_実際に_文字列-文字列マッピングであるためですが、リクエストに渡されるものに対してstr
を呼び出す一般的なアプローチは、ユーザーを驚かせる予期しない方法で誤動作する傾向があるためです。
これのTL; DRは次のとおりです。はい、これは意図的に行われたものであり、いいえ、バグではないと思います。
参照:#865。
ドットリリースの重大な変更のようですよね?
そして、あなたはChangeLogでこの巨大な変更について説明しませんでした:(
これは、APIの重大な変更ではありません。ドキュメント全体で、APIは文字列ベースであると明確に文書化されています。 意図した入力ではなく整数で使用していたという事実は、このコードベースやAPIの変更ではなく、コードのバグです。
この重大でない変更についてのメモを変更ログに追加することは良い考えかもしれません。
@ clarkbreyman-yammer明確にするために、これは少し境界的なケースです。 最近の意思決定は#3386と#3388で確認できますが、基本的な議論は次のとおりです。文字列以外のヘッダーは機能することを意図していないため、機能を停止したという事実は許容されます。 実際、これまでは機能していませんでした。
@lmazuel確かに、これは変更ログから見落とされていました。これは100%私のせいです。ここでの破損は、ヘッダー値の厳密な検証に付随するものであり、その結果、コンパイル時に表示されませんでした。変更ログ。 変更ログを作成したい場合は、変更ログを更新するPRを歓迎します。
そして明確にするために、私たち3人全員がこれに同意しています。 そこに整数を送信することが機能したという事実は、純粋に幸運でした。 以前はまったく機能していなかったので、ずっと前には機能しないはずだと判断しました。 しかし、それを_強制_するものはありませんでした。
そうは言っても、それをサポートされている機能として追加することは潜在的に素晴らしいアイデアであり、私の本では歓迎すべきAPIの変更になるでしょう(実装がうまく行われていれば)。 しかし、物事の現状は長期にわたって残る可能性があります。
変更ログにメモを追加しました。
@kennethreitzに感謝します。
わかりました、説明してくれてありがとう。 それに応じてコードを更新します。
@kennethreitzも、PyPIにメモを追加できれば、すばらしいでしょう。
@lmazuel !
@ lmazueldone✨🍰✨
@lmazuel psお手入れありがとうございます:P
コードを修正しましたが、他のすべてはうまく機能しています。 超高速の応答時間をありがとう!
公式ドキュメントには、大きな変更についての言及はありません。 それは本当に誤解を招くものです。
リクエストチームによる大きな変更とは見なされません。ドキュメント化されたライブラリの動作の範囲内に収まるバグ修正と見なされます。
@COLDMOUNTねえ、あなたはドキュメントを見つけることができ、ここでカスタムヘッダーのためのクイックスタートセクションから最後の段落に。 また、Requestsの変更ログである2.11.0のHISTORY.rstでの変更を
str型のヘッダーの例、またはその方法を提供することをお勧めします
おかげで、dict型のヘッダーをstr型に変換します。
2016年9月27日午前1時30分GMT + 08:00ネイトプルウィット[email protected] :
ねえ@COLDMOUNThttps ://github.com/COLDMOUNT 、あなたは見つけることができます
ここにドキュメント
http://docs.python-requests.org/en/master/user/quickstart/#custom -headers
カスタムヘッダーのクイックスタートセクションの最後の段落。 私たち
(HISTORY.rst)[ https:// githubで変更を公開しました
com / kennethreitz / requests / blob / master / HISTORY.rst] 2.11.0の場合
リクエストの変更ログ。—
あなたが言及されたのであなたはこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/kennethreitz/requests/issues/3477#issuecomment -249638650、
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/ARIa89wU7tKL8Br2WWU6lJy8HEbNr72Vks5quAE3gaJpZM4JffFG
。
またはdict型のヘッダーをstr型に変換する方法
待って、何? 以前はどのようにヘッダーを送信していましたか?
ページのガイドと同じように-
http://docs.python-requests.org/en/master/user/quickstart/- "
リクエストにHTTPヘッダーを追加するのと同じように、ヘッダーにdictを渡すだけです。
パラメータ。」しかし、dict型は受け入れられなくなり、strは何をしますか。
タイプはどのように見えますか?
2016年9月27日17:51 GMT + 08:00コーリーベンフィールド[email protected] :
またはdict型のヘッダーをstr型に変換する方法
待って、何? 以前はどのようにヘッダーを送信していましたか?
—
あなたが言及されたのであなたはこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/kennethreitz/requests/issues/3477#issuecomment -249819028、
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/ARIa8_ZPJmzxH2lWmpTvSJ3PvHE7jlpvks5quOcrgaJpZM4JffFG
。
@COLDMOUNT dict
は_絶対に_受け入れられます。これはまったく変更されていません。 変更したのは、そのdictのキーと値が文字列でなければならないということです。 以前は、偶然に他のいくつかのタイプになる可能性がありましたが、現在は解決されています。 ドキュメントを変更する必要はありません。
了解しました、かっこいい! ありがとう! :)
2016年9月27日18時23 GMT + 08:00コーリーベンフィールド[email protected] :
@COLDMOUNT https://github.com/COLDMOUNTdictは_絶対に_受け入れられます。
私たちはそれをまったく変えていません。 私たちが変更したのは、キーと
そのdictの値は文字列でなければなりません。 以前は可能でした
それらは偶然に他のいくつかのタイプであることが判明しましたが、現在は解決されています。 NS
ドキュメントを変更する必要はありません。—
あなたが言及されたのであなたはこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/kennethreitz/requests/issues/3477#issuecomment -249825918、
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/ARIa8z0jZ-ovBtvFWl4hTXnkk_kJXobrks5quO6ggaJpZM4JffFG
。
最も参考になるコメント
ドットリリースの重大な変更のようですよね?