Generando respuestas HTTP, respuestas de error y redirecciones
El decorador router
gestiona la petición HTTP recibida y crea un objeto reponse
con la respuesta HTTP: el código de estado, las cabaceras y los datos devueltos. Esta respuesta la prepara a partir de lo que devuelve la función vista ejecutada con cada route
. Estas funciones pueden devolver tres tipos de datos:
- Una cadena, o la generación de una plantilla (que veremos posteriormente). Por defecto se indica un código 200 y las cabeceras por defecto.
- Un objeto de la clase
response
generado con la funciónmake_repsonse
, que recibe los datos devueltos, el código de estado y las cabeceras. - Una tupla con los mismos datos: datos, cabeceras y código de respuesta.
Ejemplo de respuestas
Veamos el siguiente código:
@app.route('/string/')
def return_string():
return 'Hello, world!'
@app.route('/object/')
def return_object():
headers = {'Content-Type': 'text/plain'}
return make_response('Hello, world!', 200,headers)
@app.route('/tuple/')
def return_tuple():
return 'Hello, world!', 200, {'Content-Type':'text/plain'}
Puedes comprobar que devuelve cada una de las rutas.
Respuestas de error
Si queremos que en cualquier momento devolver una respuesta HTTP de error podemos utilizar la función abort
:
@app.route('/login')
def login():
abort(401)
# Esta línea no se ejecuta
Y lo comprobamos:
curl http://localhost:5000/login
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>401 Unauthorized</title>
<h1>Unauthorized</h1>
<p>The server could not verify that you are authorized to access the URL requested. You either supplied the wrong credentials (e.g. a bad password), or your browser doesn't understand how to supply the credentials required.</p>
Si queremos responder de la misma manera un determinado código de estado, por ejemplo queremos devolver una respuesta determinada cuando no se encuentra un recurso:
@app.errorhandler(404)
def page_not_found(error):
return 'Página no encontrada...', 404
curl http://localhost:5000/login2
Página no encontrada...
Redirecciones
Si queremos realizar una redicirección HTTP a otra URL utilizamos la función redirect
:
@app.route('/')
def index():
return redirect(url_for('return_string'))