Requests: Genere una excepción si el código de estado no es igual a 200

Creado en 27 jul. 2014  ·  3Comentarios  ·  Fuente: psf/requests

Hola,
A menudo espero que la solicitud tenga el código de estado 200 y, si no es así, no puedo hacer mucho al respecto (en serio, cuando el servidor regrese con el error 500, no podré hacer nada). Entonces necesito escribir un código como este:

    r = requests.get(self.url(False))
    if r.status_code != 200:
        raise requests.ConnectionError("Expected status code 200, but got {}".format(page.status_code))

Creo que un kwarg llamado allowed_status_codes sería muy conveniente. Podría implementarse así:
Por defecto es None . None , y una lista o tupla vacía significa permitir todos los códigos de estado. Puede ser un número entero, una lista, una tupla o una enumeración. Si es un número entero, solo permita este código de estado específico. En caso de que sea una lista o tupla, solo se permiten los códigos de estado que están dentro de la lista / tupla. La lista puede tener números enteros y / o enumeraciones. Las enumeraciones deberían ser un poco más flexibles.
Por ejemplo, si quisiera permitir todas las solicitudes "exitosas" (2xx), podría escribir: allowed_status_codes = request.ALLOW_SUCCESS, que generará una excepción a menos que el código de estado sea 2xx. Si solo quisiera rechazar los errores del servidor (y, por lo tanto, manejar los errores no autenticados), simplemente podría escribir allowed_status_codes = request.DISALLOW_SERVER_ERROR, que generará una excepción si el código del servidor es 5xx.
Por supuesto, debería haber muchas enumeraciones que cubran casos específicos. Y uno también debería poder usarlo combinado dentro de una lista (por ejemplo, (200, ALLOW_REDIRECTIONS) ).
Si el código de estado no está permitido, se generará un StatusCodeError(RequestException) .


Aunque mencioné enumeraciones, no estoy hablando de los valores enumerados de Python 3.4. Hablaba más bien de constantes. Las enumeraciones (constantes) podrían implementarse así:

#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

Comentario más útil

Además, ¿no tiene cada Response un método raise_for_status que generará una excepción si el código de estado no es 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

Todos 3 comentarios

¡Gracias por esta idea!

No está claro por qué esto pertenece a las solicitudes en sí. El código requerido no es complejo y no creo que agreguemos mucho valor al tener este código en la biblioteca. Sin embargo, _podríamos_ agregar otro argumento de palabra clave a la API, que es algo que no estamos dispuestos a hacer la mayor parte del tiempo.

Además, ¿no tiene cada Response un método raise_for_status que generará una excepción si el código de estado no es 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 Debido a que es muy conveniente, puede guardar una gran cantidad de código (digamos que un proyecto usa una solicitud. Este proyecto usa aproximadamente 100 veces una solicitud. Por lo tanto, _podría_ guardar 200 líneas de código y evitar errores tipográficos porque tendría que escribir la excepción 100 veces (en caso de que no use un método para generar una excepción), y unifica las excepciones / errores (otra API puede usar solicitudes y generar un error personalizado en caso de un código de estado no válido. Me gusta más si lanza la misma excepción que las solicitudes).

@ sigmavirus24 Lo siento, no sabía que existía este método. Debe mencionar que un HTTPError puede ser generado por raise_for_status en la sección Error y Excepciones en los documentos. Un HTTPError actualmente afirma que solo se genera "En el raro caso de una respuesta HTTP no válida".
También podría considerar implementar algunas de mis ideas en mi raise_for_status para que también pueda permitir otros códigos de estado.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

jakul picture jakul  ·  3Comentarios

thadeusb picture thadeusb  ·  3Comentarios

mitar picture mitar  ·  4Comentarios

cnicodeme picture cnicodeme  ·  3Comentarios

JimHokanson picture JimHokanson  ·  3Comentarios