Requests: Вызвать исключение, если код состояния не равен 200

Созданный на 27 июл. 2014  ·  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))

Я думаю, что kwarg под названием allowed_status_codes был бы очень удобен. Это могло быть реализовано так:
По умолчанию это None . None , а пустой список или кортеж означает, что разрешены все коды состояния. Это может быть целое число, список, кортеж или перечисление. Если это целое число, разрешить только этот конкретный код состояния. В случае, если это список или кортеж, разрешены только коды состояния, которые находятся внутри списка / кортежа. В списке могут быть целые числа и / или перечисления. Перечисления должны быть немного более гибкими.
Например, если бы я хотел разрешить все «успешные» (2xx) запросы, я мог бы написать: allowed_status_codes = requests.ALLOW_SUCCESS, что вызовет исключение, если код состояния не равен 2xx. Если бы я только хотел запретить ошибки сервера (и, таким образом, обрабатывать ошибки, не прошедшие аутентификацию), я мог бы просто написать allowed_status_codes = requests.DISALLOW_SERVER_ERROR, который вызовет исключение, если код сервера 5xx.
Конечно, должно быть много перечислений, охватывающих конкретные случаи. И можно также использовать его вместе в списке (например, (200, ALLOW_REDIRECTIONS) ).
Если код состояния не разрешен, будет поднят StatusCodeError(RequestException) .


Несмотря на то, что я упомянул перечисления, я не говорю о перечисляемых значениях Python 3.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 имеет метода raise_for_status , который вызовет исключение, если код состояния не равен 200?

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 Комментарий

Спасибо за идею!

Непонятно, почему это относится к самим запросам. Требуемый код несложный, и я не думаю, что мы добавили бы много пользы, если бы этот код был в библиотеке. Однако мы _would_ добавить еще один аргумент ключевого слова в API, что мы не склонны делать большую часть времени.

Кроме того, разве каждый Response имеет метода raise_for_status , который вызовет исключение, если код состояния не равен 200?

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 раз запрос. Таким образом, он _could_ сэкономить 200 строк кода и предотвратить опечатки, потому что мне пришлось бы писать исключение 100 раз (в случае, если я не использую метод для создания исключения), и оно объединяет исключения / ошибки (другой API может использовать запросы и вызывать настраиваемую ошибку в случае недопустимого кода состояния. Мне больше нравится, если он генерирует то же исключение, что и запросы).

@ sigmavirus24 Извините, я не знал, что этот метод существует. Следует упомянуть, что ошибка HTTPError может быть вызвана функцией raise_for_status в разделе «Ошибки и исключения» в документации. HTTPError в настоящее время утверждает, что возникает только «в редких случаях недопустимого ответа HTTP».
Вы также можете рассмотреть возможность реализации некоторых из моих идей в моем raise_for_status, чтобы он также мог разрешить другие коды состояния.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги