Tutorial de Flask: MicroFramework Python – Parte 02: Rutas, Templates y Redirecciones

Dificultad: Fácil
Tiempo de Lectura: 6 minutos

Anteriormente habíamos hablado un poco sobre como Flask trabaja como Framework, la tecnologías que utiliza y sus características. Además, también habíamos creado un muy simple proyecto, que al ingresar nos mostraba un “Hola Mundo“.

Hoy vamos a ver más detalladamente las funcionalidades que nos provee este framework y vamos a comenzar a crear un proyecto un  poco más robusto. Que a medida del tiempo irá tomando forma y utilizando la mayoría de los componentes que este framework.

Rutas en Flask

Una de las cosas más importantes en las aplicaciones, son las rutas que definimos para nuestras diferentes páginas. En Flask, tenemos la posibilidad de definir rutas amigables de forma muy fácil, sin tener que pasar por las expresiones regulares que muchas veces nos dan un dolor de cabeza. Y que aún siguen siendo utilizadas por algunos frameworks.

En nuestro proyecto de ejemplo, ya habíamos creado una ruta para el index.

Hasta ahora, teníamos algo similar a lo siguiente:

@app.route('/')
def hola_mundo():
return 'Hola, Mundo!'

 

Como vemos, simplemente le habíamos asignado a la ruta root de nuestro sistema una función que nos mostraba un “Hola Mundo!

Veamos otros ejemplos de rutas más complejas

Un ejemplo sencillo para una página que no recibe parámetros por GET ni POST sería:

@app.route('/')
def index():
return 'Página del Index'
@app.route('/hola')
def hola():
return 'Hola Mundo!!'

 

Como vemos es básicamente lo mismo que veníamos haciendo hasta ahora, solamente que le podemos agregar rutas más específicas, para así poder ir creando más páginas en nuestro sitio. En este caso, el ejemplo sería “/hola“.

Ahora bien, muchas veces necesitaremos por ejemplo, enviar variables vía URL. Como podría ser, si estamos consultando el detalle de un usuario. Podríamos por ejemplo querer acceder a él a través de su ID, que puede ser el 1, 2…n, o bien lo podríamos llegar a querer consultar por el nombre, ejemplo: “Jorge“, “Pedro“, etc.

En ese caso, el parámetro podría ser variable, para ello, en Flask debemos definir la URL de la siguiente forma:

@app.route('/usuario/<name>')
def mostrar_perfil_usuario(name):
return 'Usuario %s'% name
@app.route('/post/<post_id>')
def mostrar_post(post_id):
return 'Post %d'% post_id

Como vemos, en este caso le estamos enviando el parámetro por la URL y mostrando qué es lo que nos ha llegado con un return.

Es importante saber que en Flask contamos con los siguiente tipos de datos.

  • string: para cualquier tipo de string, sin barras (“/”).
    int: Acepta números enteros
    float: Acepta números con decimales
    path: Igual a string, pero también acepta barras (“/”)
    any: Intenta encontrar alguno de los items dados
    uuid: Acepta strings UUID

Algo importante también que hay que tener en cuenta al momento de definir las rutas en Flask, es la barra final.

Es decir, si tenemos un ejemplo como el siguiente:

@app.route('/usuarios/')
def usuarios():
return 'Los Usuarios'
@app.route('/nosotros')
def nosotros():
return 'Sobre Nosotros'

La diferencia entre estas dos URLs, si bien se ven realmente parecidas, es que en el caso de usuarios, al estar definida con el slash(“/”) al final, hace que si accedemos a dicha url sin el slash, automáticamente Flask nos redireccione a “/usuarios/“, con la barra incluida.

Por el contrario, en el caso de la URL “/nosotros“, si accedemos a “/nosotros/” nos dará un error 404.

Esto es de hecho bastante interesante, ya que en el caso de la redirección nos evitaremos por ejemplo que Google tome las URLs como diferentes e indexe contenido duplicado, es por ello, que no es una mala idea utilizarlo de esta forma.

Ahora veamos un poco como funciona Flask con diferentes Métodos HTTP

Por defecto, las rutas en Flask siempre responden como si el método fuese GET, aunque eso puede ser cambiado. Para ello, debemos especificar en la ruta los métodos que se van a utilizar en ella.

Un ejemplo sería:

@app.route('/login', methods=['GET', 'POST'])
def ingresar():
if request.method == 'POST':
ingresar()
else:
mostrar_ingresar_form()

En este caso le estamos indicando que si nuestro REQUEST viene por POST, intentemos ingresar() y de lo contrario mostremos el formulario para que el cliente pueda ingresar los datos.

Nota: Más adelante veremos bien detalladamente y con ejemplos cómo podemos utilizar el método POST a través de formularios en Flask.

Veamos como se trabaja con templates

El siguiente paso, sería pasar de nuestra ruta a una view. En este caso estaremos utilizando un template, creado en una ruta en especifico en el cual utilizaremos el ya mencionado lenguaje de template Jinja 2.

En nuestras rutas, deberíamos de tener algo como lo siguiente:

from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route('/usuario/')
def mostrar_usuario(name=None):
return render_template('usuario.html', name=name);

Primero que nada, a lo que ya teníamos le agregamos el import de “render_template“. Para poder renderizar los templates con el método “render_template()“.

Luego, agregamos una nueva ruta, le indicamos la URL y a su vez el template que utilizará, en este caso “usuario.html“. Por defecto Flask buscará los templates dentro de la carpeta template, por la cual tendrás que crearla dentro de tu proyecto.

Allí además, crearemos el template usuario.html y como ejemplo le colocaremos lo siguiente:

<!doctype html>
<title>Hola desde el Template</title>
{% if name %}
<h1>Hola {{ name }}!</h1>
{% endif %}

Ahora, si accedemos a la URL, tomará el segundo parámetro como nombre y nos dirá un mensaje como “Hola <name>!” Intercambiando name, por el nombre tomado de la URL.

Un ejemplo si accedemos a la url de nuestro proyecto sería:

 

http://127.0.0.1:5000/usuario/Guiadev

 

Redirecciones y Errores

Hay en casos en los que vamos a necesitar redireccionar nuestros usuarios y/o mostrarles errores. Veamos algunos ejemplos para llevar a cabo esto con Flask.

Por ejemplo, para el caso de las re-direcciones podemos realizar lo siguiente:

@app.route('/')
def index():
return redirect(url_for('login'))

En este caso, se estará re-direccionando el usuario a /login.

En el caso de que necesitemos por ejemplo denegarle el acceso a un usuario, podemos mostrarle un error de la siguiente forma:

@app.route('/login')
def login():
abort(401)
this_is_never_executed()

 

Si accedemos ahora a nuestro proyecto, deberíamos de ver el siguiente error:

 

También es posible modificar la página a nuestro gusto, para ello simplemente le debemos indicar a la ruta, qué template vamos a utilizar.

@app.errorhandler(404)
def page_not_found(error):
return render_template('page_not_found.html'), 404

 

Ahora al volver a acceder, veríamos nuestra página de error personalizada.

Conclusión

Como vemos Flask es un framework que si bien tiene su grado de complejidad, si ya has utilizado algún otro framework anteriormente no debería de sorprenderte su forma de trabajar. En realidad es bastante sencillo y lo mejor de todo es que es fácil de entender.

Por ahora podemos ver que en el post de hoy nos hemos centrado en las rutas de nuestra aplicación, como mostrar los datos recibidos y las vistas necesarias. Ya con esto hemos hecho un gran avance, ya que con estos conocimientos, podremos en nuestro próximo tutorial realizar envíos más complejos con el método post y también algo de lógica, del lado del controlador.

Sigue en la Parte 03 del Tutorial: Integrando Flask y Bases de datos MySQL


¿Te resultó útil el artículo? Compártelo con tus colegas: