Métodos HTTP con Flask

Cuando trabajamos con aplicaciones web y necesitamos comunicar el servidor con nuestro navegador utilizamos el protocolo HTTP (Protocolo Transferencia Hipertexto). El protocolo HTTP maneja diferentes métodos para realizar acciones.

Nosotros para trabajar con los métodos HTTP en Flask y acceder a diferentes rutas y datos de nuestra aplicación web, trabajaremos con los métodos GET y POST.

Métodos GET y POST con Flask

Si no le indicamos nada nuestras peticiones con el decorador route() siempre van a realizarse por defecto con el método GET.

  • Método GET → Solicitamos información al servidor haciéndolo de forma visible mediante la URL.
  • Método POST → Envía la información para que sea procesada en nuestro servidor sin hacerla visible.

Importante → Debemos comprender quién envía y qué se envía antes de seguir.

Vamos a verlo más en detalle.

  • Método GET → Cuando vamos al navegador y escribimos una ruta como por ejemplo http://localhost:5000 estamos solicitando una respuesta a nuestro servidor para nos diga qué tiene para mostrarnos en esa URL. Desde el servidor nosotros le devolvemos lo que hemos establecido previamente para esa petición en nuestra aplicación Flask, que es la plantilla Jinja2 metodos.html.

    Debemos tener claro que aunque tengamos que enviar una URL para que el servidor sepa qué tiene que devolvernos, la función principal de GET es obtener información del servidor.

    Podríamos enviar también el identificador de una película para que nos devolviese toda la información de nuestra base de datos sobre esa película. La información que enviemos con GET viajará como parámetro y será visible para todos en la URL de nuestro navegador. Get → Conseguir → Obtener
  • Método POST → Vamos a utilizar el método POST con Flask para enviar información a nuestro servidor y que esta sea procesada de alguna forma.

    La información que enviemos mediante POST viaja como dato en el cuerpo del mensaje y no es visible (la teoría es que estos datos no son visibles, pero realmente existe riesgo de que sean interceptados, de ahí que se recomiende siempre utilizar HTTPS y no HTTP).

Métodos HTTP en Flask

Vamos a ver un ejemplo partiendo como siempre de nuestro ‘Hola mundo!’. Además, importaremos la función render_template() que ya hemos visto en otros tutoriales y renderizaremos nuestra plantilla Jinja2 que incluye dos pequeños formularios.

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hola_mundo():
   return render_template('metodos.html')

if __name__ == '__main__':
    app.run(debug=True)
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- CSS only -->
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
    <title>Métodos HTTP</title>
</head>
<body class="p-3">
    <h1>Métodos HTTP con Flask!</h1>
    <div class="p-3 bg-secondary text-white rounded" style="max-width: 20rem;">
        <h2>Método GET</h2>
        <form action="/reciboget">
            <input type="text" name="marca" placeholder="Marca consola">
            <input type="text" name="consola" placeholder="Modelo consola">
            <button type="submit">Aceptar</button>
        </form>
    </div>
    <hr>
    <div class="p-3 bg-secondary text-white rounded" style="max-width: 20rem;">
        <h2>Método POST</h2>
        <form action="/recibopost" method="POST">
            <input type="text" name="marca" placeholder="Marca consola">
            <input type="text" name="consola" placeholder="Modelo consola">
            <button type="submit">Aceptar</button>
        </form>
    </div>
</body>
</html>

Nuestros formularios nos permite introducir dos campos de texto y una vez que pulsemos el botón de Aceptar uno se enviará con el método GET y otro con el método POST.

La acción de cada formulario nos redirigirá a una ruta diferente en cada caso.

  • Envío GET a la ruta → /reciboget
  • Envío POST a la ruta → /recibopost

Cuando enviamos un formulario y no especificamos el tipo de método para el envío se utiliza por defecto GET, lo mismo pasa con nuestro decorador route() en la función asociada la ruta ‘/reciboget’.

Si queremos enviar y recibir nuestros valores mediante el método POST tenemos que especificarlo siempre.

@app.route('/reciboget')
def recibo_get():
    return f'<h1>Enviado nuestro formulario mediante GET</h1>'


@app.route('/recibopost', methods=['POST'])
def recibo_post():
    return f'<h1>Enviado nuestro formulario mediante POST</h1>'

Método GET con Flask

Vamos a rellenar el formulario GET y vamos a enviar los valores para que veamos cómo viajan los valores que introducimos.

Enviando formulario con método GET
http://localhost:5000/

Vemos que cuando introducimos los valores y pulsamos el botón de Aceptar, se nos redirige a la ruta que indicamos y los valores pasan como argumentos en nuestra URL de forma visible para todos.

"GET /reciboget?marca=Sega&consola=Master+System HTTP/1.1" 200 -

Método POST con Flask

Ahora vamos a rellenar el formulario POST y lo enviaremos de la misma forma pulsando el botón de Aceptar.

No olvidemos que nuestro formulario POST si tiene especificado el método de envío como POST.

Enviando formulario con método POST
http://localhost:5000/

Podemos apreciar que esta vez al enviar el formulario nos redirige a la ruta que indicamos pero no pasa ningún dato de forma visible como argumento en la URL.

"POST /recibopost HTTP/1.1" 200 -

Accediendo a los datos

Ahora vamos a ver cómo acceder desde nuestra aplicación a los valores que estamos enviando desde los formularios mediante los métodos GET y POST con Flask.

Lo primero que haremos será importar con nuestra aplicación request.

from flask import Flask, render_template, request

print(type(request))
# <class 'werkzeug.local.LocalProxy'>

Ahora modificaremos las dos funciones que mostraban el mensaje de formulario enviado, para verificar qué método utilizan para realizar el envío y actuar en consecuencia.

Método GET

Verificamos el método sea GET y rescatamos los valores guardándolos en una variable para posteriormente imprimirlos en pantalla.

@app.route('/reciboget')
def recibo_get():
    if request.method == 'GET':
        marca = request.args.get('marca')
        consola = request.args.get('consola')
        return f'<h1>Enviado nuestro formulario mediante GET</h1> Introduciste la consola {consola} de la marca {marca}'
Recibiendo valores por GET y mostrando en pantalla
http://localhost:5000/reciboget?marca=Sega&consola=Master+System

Podemos verificar que nuestros datos quedan expuestos en la URL como argumentos visibles para todos. El método GET no tiene cuerpo de mensaje para incluir los datos, siempre viajan en la URL.

Método POST

Ahora verificaremos que los datos vengan con el método POST y de la misma forma los almacenaremos en unas variables para mostrarlos en pantalla.

Recibiendo valores por POST y mostrando en pantalla
http://localhost:5000/recibopost

Podemos ver que nuestros datos viajan ‘escondidos’ sin ser argumentos en la URL. Cuando enviamos datos mediante POST los datos viajan en el cuerpo del mensaje no en la URL.

Renderizando formulario en Jinja2

Ahora vamos a crear un tercer formulario en nuestra plantilla que envíe los datos mediante POST e imprima el valor de los datos que le pasamos en la misma plantilla.

<div class="p-3 bg-secondary text-white rounded" style="max-width: 20rem;">
    <h2>Método POST y visualizo en la plantilla</h2>
    <form action="/visualizoplantilla" method="POST">
        <input type="text" name="marca" placeholder="Marca consola">
        <input type="text" name="consola" placeholder="Modelo consola">
        <button type="submit">Aceptar</button>
    </form>
    {% if consola %}
    Introduciste la consola {{ consola }} de la marca {{ marca }}
    {% endif %}
</div>
@app.route('/visualizoplantilla', methods=['POST'])
def visualizo_plantilla():
    if request.method == 'POST':
        marca = request.form['marca']
        consola = request.form['consola']
        return render_template('metodos.html', marca=marca, consola=consola)
Recibiendo valores por POST y mostrando en la misma plantilla

Errores enviando y recibiendo de diferentes métodos.

Algunas veces podemos encontrarnos errores si enviamos nuestros datos con un método y los recibimos con otro, por esto siempre es buena idea verificar que los datos lleguen por el método correcto.

Este tipo de error suele ser un error 405, por ejemplo cuando intentamos rescatar como POST los datos de un formulario que han sido enviados mediante GET.

Desde aquí puedes ver los códigos de estado HTTP.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *