こんにちは、
リクエストのステータスコードが200であるとよく予想しますが、そうでない場合は、できることはあまりありません(サーバーがエラー500で戻った場合、何もできなくなります)。 だから私はこのようなコードを書く必要があります:
r = requests.get(self.url(False))
if r.status_code != 200:
raise requests.ConnectionError("Expected status code 200, but got {}".format(page.status_code))
私はallowed_status_codesと呼ばれるkwargが非常に便利だと思います。 これは次のように実装できます。
デフォルトではNone
です。 None
、および空のリストまたはタプルは、すべてのステータスコードを許可することを意味します。 整数、リスト、タプル、または列挙型の場合があります。 整数の場合は、この特定のステータスコードのみを許可してください。 リストまたはタプルの場合、リスト/タプル内にあるステータスコードのみが許可されます。 リストには整数や列挙型が含まれる場合があります。 列挙型はもう少し柔軟にする必要があります。
たとえば、すべての「成功した」(2xx)リクエストを許可したい場合は、allowed_status_codes = requests.ALLOW_SUCCESSと書くことができます。これは、ステータスコードが2xxでない限り例外をスローします。 サーバーエラーのみを禁止したい(したがって、認証されていないエラーを処理したい)場合は、allowed_status_codes = requests.DISALLOW_SERVER_ERRORと記述するだけで、サーバーコードが5xxの場合に例外が発生します。
もちろん、特定のケースをカバーする列挙型がたくさんあるはずです。 また、リスト内で組み合わせて使用できる必要があります(例: (200, ALLOW_REDIRECTIONS)
)。
ステータスコードが許可されていない場合、 StatusCodeError(RequestException)
が発生します。
列挙型については言及しましたが、Python3.4の列挙型の値については話していません。 私はむしろ定数について話していました。 列挙型(定数)は次のように実装できます。
#request model.
ALLOW_SUCCESS = AllowSuccessEnum()
# other enums
class RequestEnum(object):
def is_status_code_allowed(status_code):
raise NotImplementedError
class AllowSuccessEnum(RequestEnum):
def is_status_code_allowed(status_code):
# return false unless status code is 2xx
このアイデアをありがとう!
これがリクエスト自体に属する理由は明らかではありません。 必要なコードは複雑ではなく、ライブラリにこのコードを含めることで多くの価値を追加できるとは思いません。 ただし、APIに別のキーワード引数を追加する予定です。これは、ほとんどの場合、実行することを躊躇していることです。
また、各Response
は、ステータスコードが200でない場合に例外を発生させるraise_for_status
メソッドがありませんか?
Python 2.7.7 (default, Jun 2 2014, 18:55:26)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> r = requests.get('http://httpbin.org/404')
>>> r
<Response [404]>
>>> r.raise_for_status()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/site-packages/requests/models.py", line 795, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 404 Client Error: NOT FOUND
@Lukasa非常に便利なため、多くのコードを節約できます(たとえば、プロジェクトがリクエストを使用するとします。このプロジェクトはリクエストの約100倍を使用します。したがって、200行のコードを節約でき、タイプミスを防ぐことができます。例外を100回(例外を発生させるメソッドを使用しない場合)、例外/エラーを統合します(別のAPIがリクエストを使用し、無効なステータスコードの場合にカスタムエラーを発生させる可能性があります。リクエストと同じ例外をスローします)。
@ sigmavirus24申し訳ありませんが、このメソッドが存在することを知りませんでした。 HTTPErrorは、ドキュメントの「エラーと例外」セクションのraise_for_statusによって発生する可能性があることに注意してください。 HTTPErrorは現在、「まれに無効なHTTP応答が発生した場合」にのみ発生すると主張しています。
他のステータスコードも許可できるように、私のアイデアの一部をraise_for_statusに実装することを検討することもできます。
最も参考になるコメント
また、各
Response
は、ステータスコードが200でない場合に例外を発生させるraise_for_status
メソッドがありませんか?