Según the urllib2 documentation,¿Por qué el urllib2.urlopen() de Python genera un HTTPError para códigos de estado exitosos?
Debido a que los controladores predeterminados manejar las redirecciones (códigos en el rango de 300), y códigos en el rango de 100-299 indican el éxito, por lo general sólo se ve códigos de error en el rango de 400 a 599 .
Y sin embargo, el siguiente código
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)
plantea una HTTPError con código 201 (creado):
ERROR 2011-08-11 20:40:17,318 __init__.py:463] HTTP Error 201: Created
¿Por qué es urllib2
lanzando httpErrors sobre esta solicitud exitosa?
No es demasiado doloroso; Puedo extender fácilmente el código para:
try:
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)
except HTTPError, e:
if e.code == 201:
# success! :)
else:
# fail! :(
else:
# when will this happen...?
Pero este no parece ser el comportamiento previsto, en base a la documentación y el hecho de que no puedo encontrar las preguntas similares sobre este extraño comportamiento.
Además, lo que debe esperar el bloque else
? Si todos los códigos de estado exitosos se interpretan como HTTPError
s, ¿cuándo devuelve el objeto de respuesta normal similar a un archivo urllib2.urlopen()
el que se refiere a la documentación de urllib2
?
Es muy raro ver respuesta de códigos entre 201-299. No me sorprende que urllib2 no los maneje perfectamente. – Leopd
¿Me estoy perdiendo algo? 201 funciona bien para mí ... – Santa
@Santa, ¿quizás estás usando un controlador no estándar, según la respuesta de dcrosta? – rubergly