Parámetros GET y POST con Flask


Introducción:

Hola amigos de Internet, mi nombre es Luis, y los doy la bienvenida a Mi Diario Python.

En este articulo, veremos un tema que todo desarrollador web debe saber y manejar a la perfección. Estoy hablando de los parámetros. 

Veremos como podemos recibir y leer información a través de los parámetros GET y POST utilizando el Framework para el desarrollo web con Python, Flask

He escrito un par de artículos sobre Flask, pero nunca a cerca de los parámetros GET y POST. Y como es algo muy importante e imprescindible al realizar aplicaciones web, no podía faltar este tema.

Así que sin más, comencemos.


Resultado de imagen para get y post


¿GET y POST? ¿Qué es eso?

Para los que todavía no conocen los parámetros GET y POST. Aquí una breve explicación.

Como la mayoría debe saber, la comunicación entre clientes y el servidores en Internet, se realizan a través del protocolo HTTP (Protocolo de Transferencia de Hipertexto). Un usuario envía una solicitud a un servidor, el cual da como respuesta una pagina web (un documento HTML). Los métodos utilizados para este tipo de comunicación son los parámetros GET y POST.

La diferencia entre estos dos parámetros es que GET, envía la información haciéndola visible en la URL de la pagina web. Mientras que POST, envía la información ocultándola del usuario.

Veamos un ejemplo:


https://www.pythondiario.com/articulos.html?tag=Flask




En la url anterior podemos ver varias cosas. Primero tenemos el dominio, pythondiario.com. Luego tenemos el nombre del documento, articulos.html. Luego esto vemos un simbolo de interrogación. Esto indica que luego del símbolo estarán los parámetros, la información que se le ha pasado a la pagina. 


Podemos ver claramente que la información se ha enviado utilizando GET, ya que la información es visible para el usuario.


Por lo contrario en la siguiente url no se muestra la información , por lo que es claro que se a utilizado POST:


https://www.pythondiario.com/articulos.html




Teniendo todo esto claro, podemos seguir.




Parámetro GET con Flask:

Muy bien, ya vimos un poco de teoría. Es hora de ir a la practica.

El ejemplo que realizare, sera el login de un usuario. Para ello crear un formulario un dos entradas: una para el nombre del usuario y la otra para la contraseña. Todo esto la haré en un documento HTML. form.html.


<form action="/usuario" method="get">
<label for="nombreUser">Nombre de Usuario</label>
<input type="text" name="nombreUser"><br/>

<label for="contraseña">Contraseña</label>
<input type="password" name="contraseña"><br/>

<input type="submit" value="Iniciar Sesión" />
</form>



Este seria nuestro formulario. Muy simple. Como pueden observar en la etiqueta form. He agregado dos atributos: action: seria la ruta a la cual se enviara la información. method: es el método que se utilizara para enviar la información, en este caso get.

Luego tenemos las dos entradas, y el botón submit para enviar la información.

Ya que tenemos nuestro formulario. Es hora de escribir nuestro script.

# importamos lo necesario
from flask import Flask, render_template, request

# Instancia de Flask. Aplicación
app
= Flask(__name__)

# Creamos nuestro primer route. '/login'
@app
.route('/login')
def template():
# Renderizamos la plantilla. Formulario HTML.
# templates/form.html
return render_template("form.html")

# Definimos el route con el método GET
@app
.route('/usuario',methods=['GET'])
def usuario():
# Obtenemos la información del parametro "nombreUser"
# Esto lo hacemos con "request.args.get"
nombreUser
= request.args.get('nombreUser')

# Retornamos la respuesta
return "<h1>Bienvenido " + nombreUser + "</h1>"

if __name__ == '__main__':
# Iniciamos la apicación en modo debug
app
.run(debug=True)



De esta manera quedaría nuestro script Parametro GET.py.

En la primera función template, renderizamos la plantilla, form.html. Si no sabes como renderizar plantillas con Flask, te invito a leer el articulo: Renderizar Plantillas en Flask.

Luego, en el route de "/usuario", definimos methods=['GET']. Esto nos permitira obtener los datos enviados con GET.

Para poder obtener los datos, utilizamos requets.args.get, al cual le pasamos el nombre del argumento, el cual es el mismo que se le da al campo de texto que definimos en el formulario HTML. En este caso, nombreUser.

Luego retornamos la respuesta. Una etiqueta h1 la cual dira "Bienvenido (nombre del usuario)".

Por ultimo, iniciamos la aplicaciones con app.run.

Ejecutamos el script, y nos dirigimos a http://localhost:5000/login.

Como resultado tenemos, al formulario HTML. Ahora llenemos los campos e iniciemos sesión.

Al iniciar sesión, nos redirigirá  al siguiente pagina:



Muy bien, como podemos observar, todo funciona a la perfección. Podemos ver la información enviada en la URL. 

Pero si observar con atención, y nos colocamos en contexto de que esta es una pagina de login, estamos cometiendo un error muy grave. La contraseña del usuario es visible en la URL. Imagínate que alguien entra y revisa tu historial, podrá ver tu nombre de usuario y contraseña. 

En los casos en donde se manejara información sensible, el parámetro GET es inútil. Y es aquí en donde entra POST.


Parámetro POST con Flask:

Como vimos anteriormente, todo funciono de maravilla. La información se transmitida y recibida. La cuestión esta en que en el caso de crear un login utilizando GET, la información es visible en la URL. Esto un fallo de seguridad muy grave. 

Pero no te preocupes, POST resolverá todos nuestros problemas.

Para utilizar POST, devemos combiar el atributo method del formulario HTML. Solo vamos al documenot, y cambiamos get por post:

<form action="/usuario" method="post">
<label for="nombreUser">Nombre de Usuario</label>
<input type="text" name="nombreUser"><br/>

<label for="contraseña">Contraseña</label>
<input type="password" name="contraseña"><br/>

<input type="submit" value="Iniciar Sesión" />
</form>


Y listo. Nuestro formulario HTML ya esta capacitado para enviar información a través de POST.


Ahora, creare un nuesvo script Parametro POST.py. Haremos lo mismo que el script anterior. Solo cambiaremos dos cosas:

En methods cambiamos de GET a POST. 

Y ña manera de obtener la información, es diferente a la de GET. La información enviada con POST, se almacena en el diccionario form de request. Solo ingresamos la clave, en este caso nombreUser.

# importamos lo necesario
from flask import Flask, render_template, request

# Instancia de Flask. Aplicación
app
= Flask(__name__)

# Creamos nuestro primer route. '/login'
@app
.route('/login')
def template():
# Renderizamos la plantilla. Formulario HTML.
# templates/form.html
return render_template("form.html")

# Definimos el route con el método POST
@app
.route('/usuario',methods=['POST'])
def usuario():
# Obtenemos la información del parametro "nombreUser"
# Esto lo hacemos con el diccionario "form"
nombreUser
= request.form['nombreUser']

# Retornamos la respuesta
return "<h1>Bienvenido " + nombreUser + "</h1>"

if __name__ == '__main__':
# Iniciamos la apicación en modo debug
app
.run(debug=True)



Ejecutamos el scritp, nos dirigimos a http://localhost:5000/login, iniciamos sesión y veamos el resultado.

Excelente, ahora nuestra información, es invisible.

Puedes ver todos los códigos fuentes ingresando al siguiente enlace: https://github.com/LuisAlejandroSalcedo/Parametros-GET-y-POST-con-Flask/.

Y con esto finalizamos el articulo. ¿Alguna duda? ¿Alguna sugerencia? Déjanos tu comentario, y con mucho gusto te ayudaremos.

Mi nombre es Luis, y fue un placer compartir mis conocimientos con todos ustedes :D.
  1. Unknown dice:

    Excelente las personas como vos que comparten su conocimiento

    1. Luis Salcedo dice:

      Muchas gracias Paulo, por visitar el blog y compartir tu comentario. :D.

  2. Abel Monasterio dice:

    Hola Luis:

    Estoy intentando hacer el ejemplo que estas planteando en este artículo, pero no me esta funcionando.

    He comprobado que instalé y funciona correctamente el Flask, lo comprobé con este ejemplo:

    "
    from flask import Flask
    app = Flask(__name__)

    @app.route('/')
    def hello_world():
    return 'Hola amigos¡'

    if __name__ == '__main__':
    app.run()
    "

    Ahora bien, no tengo claro del por qué no me funciona tu ejemplo, la aplicación en .py no encuentra el archivo 'form.html' que he creado, comprobé abriendo directamente dicho form.html y lo hace a la perfección.

    Mi problema específico es que no sé dónde deben residir estos archivos, haber sí me explico:

    .../prueba/aplicacion.py
    .../prueba/form.html

    ó

    .../prueba/aplicacion.py
    .../prueba/login/form.html

    Porque no se me ocurre otra explicación del porqué no parece encontrar el form.html

    Gracias de antemano por cualquier aclaración que puedas dar.

  3. Abel Monasterio dice:

    Actualizo la información del problema que tengo...

    analizando el problema me encontré que el error es la imposibilidad de interpretar al menos un byte de algún archivo (no sé cual), el error me aparece así:

    ...
    File "C:UsersUSERAppDataLocalProgramsPythonPython37-32libsite-packagesflasktemplating.py", line 83, in _get_source_fast return loader.get_source(environment, template)
    File "C:UsersUSERAppDataLocalProgramsPythonPython37-32libsite-packagesjinja2loaders.py", line 175, in get_source contents = f.read().decode(self.encoding)
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 169: invalid continuation byte

    Sólo puse lo final porque es bastante largo la ruta del error, he probado cambiando los archivos .py y .html reescribiendolos de nuevo, reduciendo el tamaño y aumentandolo también, siempre me indica la misma posición de byte (169), he probado en dos computadores diferentes, con dos versiones diferentes de python (3.4 y 3.7), y el error persiste, en internet no hallo la solución.

    ¿Alguna idea?

    Gracias.

  4. Abel Monasterio dice:

    Ya resolví el problema, como editor estoy usando Sublimetext 3, cuando hice el archivo html lo salvé con la configuración predeterminada del editor (Windows 1252), cuando especifiqué que usara UTF-8, al salvarlo y probar... ¡FUNCIONÓ A LA PERFECCIÓN! =-D

  5. Unknown dice:

    Hola Luis, enhorabuena por tu blog, me está siendo de mucha utilidad para aprender a manejar Flask. Tengo una pregunta, que supongo que la respuesta es que si, pero no lo tengo muy claro. Se podría acceder al servidor creado con Flask desde fuera de nuestra red local?

  6. Diego dice:

    Que buen contenido hermano

Deja una respuesta

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

Subir
White Monkey