Requests: ステータスコードが200に等しくない場合は、例外を発生させます

作成日 2014年07月27日  ·  3コメント  ·  ソース: psf/requests

こんにちは、
リクエストのステータスコードが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

最も参考になるコメント

また、各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

全てのコメント3件

このアイデアをありがとう!

これがリクエスト自体に属する理由は明らかではありません。 必要なコードは複雑ではなく、ライブラリにこのコードを含めることで多くの価値を追加できるとは思いません。 ただし、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に実装することを検討することもできます。

このページは役に立ちましたか?
0 / 5 - 0 評価