Foros del Web » Programando para Internet » Python »

Http code status por python 3

Estas en el tema de Http code status por python 3 en el foro de Python en Foros del Web. Estimados como es posible obtener el status de un url en python para que ejecute distintas funciones segun el status ejemplo if status == 400 ...
  #1 (permalink)  
Antiguo 16/08/2011, 00:22
 
Fecha de Ingreso: marzo-2009
Mensajes: 41
Antigüedad: 15 años, 1 mes
Puntos: 1
Http code status por python 3

Estimados

como es posible obtener el status de un url en python para que ejecute distintas funciones segun el status ejemplo

if status == 400
siguientes acciones
elif status == 500
otras acciones
elif status == 300
otras
elif status == 200
print ("esta ok")

lo pregunto por que al hacer

req = urllib.request.Request(url, data, headers)
urllib.request.urlopen(req)

me bota la aplicación y me da el siguiente error solo cuando es 404
Código:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.2/urllib/request.py", line 138, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/local/lib/python3.2/urllib/request.py", line 375, in open
    response = meth(req, response)
  File "/usr/local/lib/python3.2/urllib/request.py", line 487, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/local/lib/python3.2/urllib/request.py", line 413, in error
    return self._call_chain(*args)
  File "/usr/local/lib/python3.2/urllib/request.py", line 347, in _call_chain
    result = func(*args)
  File "/usr/local/lib/python3.2/urllib/request.py", line 495, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 404: Not Found
intente con un try, pero nose como diferenciarlo para cada caso.
  #2 (permalink)  
Antiguo 16/08/2011, 11:16
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Http code status por python 3

Este es un pedazo de código que hice hace tiempo

Código Python:
Ver original
  1. import urrlib
  2. import httplib
  3. def post_request(host, port, path, headers, data):
  4.     parms = urllib.urlencode(data)
  5.     conn = httplib.HTTPConnection("%s:%s" % (host, port))
  6.     conn.request("POST", path, parms, headers)
  7.     response = conn.getresponse()
  8.     data = response.read()
  9.     conn.close()
  10.     return response, data

Trabaja mas o menos de la siguiente manera:
Supón que tiene una url de esta forma "http://somepage.com/form.html".
Entonces le tienes que pasar el host, el puerto, el path, los headers y la data.

El host en el ejemplo seria somepage.com
El puerto seria 80
El path seria /form.html
Los headers serían un diccionario
Los datos seria también un diccionario (esto serian los campos del formulario)

Entonces para llamarlo te quedaría algo mas o menos así:
Código Python:
Ver original
  1. host = "somepage.com"
  2. port = "80"
  3. path = "/form.html"
  4. headers = {"Accept": "text/plain"}
  5. data = {"campo1":"valor1", "campo2":"valor2"}
  6. responseCode, html = post_request(host, port, path, headers, data)
  #3 (permalink)  
Antiguo 16/08/2011, 11:53
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Http code status por python 3

Debes hacer algo como esto:
Código Python:
Ver original
  1. try:
  2.     urllib.urlopen....
  3. except: HTTPError as e:
  4.     print e.code
  #4 (permalink)  
Antiguo 16/08/2011, 12:46
 
Fecha de Ingreso: marzo-2009
Mensajes: 41
Antigüedad: 15 años, 1 mes
Puntos: 1
Respuesta: Http code status por python 3

@razpeitia
No me quedo claro como obtener el codigo del error

@AlvaroG
Con eso podre obtener código 200??, tengo entendido que no es considerado error
  #5 (permalink)  
Antiguo 16/08/2011, 13:44
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Http code status por python 3

Cita:
Iniciado por exorton Ver Mensaje
Con eso podre obtener código 200??, tengo entendido que no es considerado error
Exacto: como no es un error, no entrarás al bloque except, podés manejar ese caso (y el caso de cualquier otro código de éxito 2xx) desde el bloque del try.


Saludos.
  #6 (permalink)  
Antiguo 16/08/2011, 14:26
 
Fecha de Ingreso: marzo-2009
Mensajes: 41
Antigüedad: 15 años, 1 mes
Puntos: 1
Respuesta: Http code status por python 3

Cita:
Iniciado por AlvaroG Ver Mensaje
Exacto: como no es un error, no entrarás al bloque except, podés manejar ese caso (y el caso de cualquier otro código de éxito 2xx) desde el bloque del try.


Saludos.
Bueno los que son 500 tampoco me los muestra como errores y como puedo agregar los URLError??,

En definitiva necesito obtener el codigo status del http antes de trabajar con los enlaces, ya que si me da 300 tengo que probar con otro link y mandar contraseña y usuario, si es 400, pruebo con otro link y si es 500 tengo que probar con otras cosas y ver que códigos me envía.
  #7 (permalink)  
Antiguo 16/08/2011, 15:13
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Http code status por python 3

HTTPError hereda de URLError, por lo que para capturar ambas tendrías que hacer:

Código Python:
Ver original
  1. try:
  2.     ....
  3. except HTTPError as e:
  4.     ....
  5. except URLError as e:
  6.     ....

Además:
  • Si la respuesta es 30x, urllib2 se encargará de hacer la redirección, no lanza HTTPError.
  • Los códigos < 300 son códigos de respuesta exitosa, por lo que no lanzan HTTPError. Los podés manejar como lo intentaste al principio
  • Todo código >= 400 lanza un HTTPError
  #8 (permalink)  
Antiguo 16/08/2011, 20:45
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Http code status por python 3

@exorton
El código de error (o de status) siempre es "responseCode" en el segundo código.

Etiquetas: code, python3, https
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 17:47.