lunes, 20 de julio de 2020

Flask 8. Peticiones HTTP y métodos GET y POST


Peticiones HTTP


Al principio del curso comentamos que cuando Flask recibe una petición HTTP, mira a ver si la Url a la que accedemos se corresponde con una ruta y un método que tengamos definido en una determinada route y entonces ejecuta la función correspondiente. Esta petición puede realizarse a través de dos tipos de métodos distintos GET y POST. 

La diferencia entre ambos básicamente radica en la forma de enviar los datos a la url solicitada. Mientras que el método GET envía los datos usando la url y por tanto de forma que todo el mundo ve lo que se envía, el método POST los manda de forma que no podamos verlos, van ocultos para el usuario, no los podremos ver en la URL (se utilizan para enviar por ejemplo contraseñas u otra información confidencial de formularios)

En resumen:

GET - se utiliza para realizar una petición para obtener un recurso del servidor web.
Cuando hemos entrado a cualquier pagina de ejemplo de nuestra aplicación, hasta el momento siempre lo hemos hecho con el método GET, podíamos ver perfectamente la url que introducimos:

http://127.0.0.1:5000/alejandro/

POST - Aunque con el método GET también podemos mandar información al servidor (por medio de parámetros escritos en la URL), utilizamos el método POST para enviar información a una determinada URL y de forma no visible. Normalmente utilizamos los formularios HTML para enviar información al servidor por medio del método POST.

Por defecto las rutas que escribimos en las funciones route solo son accesibles utilizando del método GET.

Objeto Request


Vamos a ver como funciona en la práctica el método GET y POST, pero antes debemos conocer un nuevo objeto llamado request que nos va a facilitar la vida, ya que nos dará toda la información sobre la petición HTML que realizamos cuando usamos cualquiera de las Url que hemos visto en nuestros ejemplos. Por ejemplo: saber si la llamada utiliza el método GET o POST o que información se ha enviado en un formulario.

Empecemos:

- Creemos un nuevo programa de Flask con el siguiente código:




1.- Lo primero, a parte de importar Flask, es necesario importar el objeto request que luego utilizaremos.

Como vemos este sencillo programa tiene dos vistas. Una para la página de inicio ("/") y otra, que es la que nos interesa, que es la vista ("/info/"). Lo único novedoso es en la linea 8, el uso al final en el decorador de la instrucción:

methods=["GET","POST"]

Con esto le decimos al programa que a la vista se la podrá llamar tanto con el método GET (por defecto es el que se usa) como con el método POST en el que profundizaremos más adelante. Si por la razón que fuera quisiéramos que la vista "info" solo pudiera ser accesible con el método Post cambiariamos la vista a:

                                                                @app.route("/info/",methods=["POST"])

y si intentas aceder a ella a través de 127.0.0.1:5000/info/ obtendrías un bonito error.

---------------------------------------------------------------

Method Not Allowed

The method is not allowed for the requested URL.
---------------------------------------------------------------

Por tanto lo vamos a dejar como estaba:

@app.route("/info/",methods=["GET","POST"])

Si ejecutamos el programa y acedemos a la vista:


127.0.0.1:5000/info/

lo hacemos, como ya explique usando el metodo GET que es el que se usa para entrar en las vistas. Aquí entra en juego el objeto request.method. Este nos devolverá el método HTML con el que hemos accedido, lo que utilizara el condicional para retornarnos toda la información que nos facilita el objeto request.



Flask usa un tipo especial de diccionario InmutableMultiDict([]) en algunos de sus atributos, como puedes ver arriba, en el que se puede guardar varios valores por cada clave.

Usando el método POST.


Ahora usaremos todo lo anterior para ver un ejemplo sencillo de como funciona el método POST junto con request. Lo primero insertaré en el código, un formulario HTLM muy sencillo y sin florituras, que contendrá una entrada de texto para que escribas el nombre y un botón enviar que servirá para mandar el formulario mediante el método POST (líneas 23 -29):

<form action="/info/" method="POST">
        <hr/>
        <label> Introduce tu nombre </label>
        <input type="text" name="minombre">
        <strong> Al pulsar enviar accederás a la vista con el metodo POST </strong>
        <input type="submit" value="Enviar"/>
</form>

El formulario enviará lo que escribas en el cuadro de texto, a la vista /info/ cuando presiones el botón "Enviar". Lo hará mediante la variable que he llamado "minombre".

Justo después del primer if, que contendrá lo que hace el programa cuando reciba una petición POST, quitamos la orden pass y tecleamos (líneas 11 - 12):

        usuario = request.form.get("minombre")
        return f"Has accedido usando el metodo POST, {usuario}"

Aquí ves como la variable "usuario" recoge el valor de la variable "minombre" que le hemos enviado desde el formulario. Esto lo hacemos con el método request.form.get(" ... ").  El ultimo paso es publicar el texto en pantalla.

En imagenes:

Accedemos a la Url 127.0.0.1:5000/info/ y en el cuadro de texto tecleamos cualquier nombre y le damos a enviar. Al entrar la primera vez en la vista lo estamos haciendo con el método GET


Al enviar el formulario, el programa detecta que lo hacemos con el método POST, y nos mostrará por pantalla:


sin necesidad de que tecleemos ninguna url, ya que al definir el formulario ya le hemos dicho a donde tenía que mandarlo con el atributo action="/info/"

Código del programa de este capítulo.





No hay comentarios:

Publicar un comentario