Hace unas semanas me tope con un pequeño proyecto en Flask, framework python del cual solo tenia conocimiento por nombre y hoy quiero compartir lo poco que he aprendido. Pasando desde el manejo para renderear los templates, como trabaja con las rutas, un poco de autenticacion, manejo de formularios, etc.
Introducción
Primero como dicen Flask es un microframework, tenemos lo justo y necesario para empezar a crear una aplicación web o un servicio, pero podemos aumentar las funcionalidad con los plugins. Esto me parece una gran ventaja porque no vamos a estar descargando e instalando cosas innecesarias.
A Continuación algunos plugins que he probado:
- flask-Bootstrap: Hojas de estilo para la página con este conocido framework ccs.
- flask-WTF: Sirve para generar formularios de HTML con clases y objetos.
- flask-Sqlalchemy: Sirve para poder generar el modelo de datos.
- flask-login: Sirve para la autenticación de usuario y contraseña.
- flask-testing: Como su nombre lo dice sirve para crear nuestros sets de test.
Como recomendación todos los plugins los pondremos en un archivo requeriments.txt para poder desde consola instalarlas con el comando pi install requeriments.txt.

Enrutamiento: Rutas y Métodos
Las rutas en Flask se pueden definir utilizando el decorador route, cuando la aplicación recibe una solicitud de una URL que coincide con esta cadena, se invocara la función decorada.

Trabajando con peticiones HTTP
Cuando la URL que accedemos corresponde con una ruta se ejecuta la función correspondiente y desde esa función se puede acceder al objeto request que posee toda la información de la petición. Algunos de los atributos mas importantes del objeto request serian request.args (Parámetros con información que vienen desde la URL en las peticiones GET), request.files (Ficheros para subir al servidor), request.header (Las cabeceras de la petición HTTP), etc.
- Si queremos devolver una respuesta HTTP de error podemos utilizar la función abort.
- Si queremos una redireccion HTTP podemos utilizar la función redirect.
Plantillas con Jinja2
Para renderizar una plantilla creada con Jinja2 simplemente hay que hacer uso del método render_template() . A este método debemos pasarle el nombre de nuestra plantilla y las variables necesarias para su renderizado como parámetros clave-valor. Es importante crear los archivos en el directorio templates de nuestro proyecto.

Herencia de plantillas
Las plantillas de jinja2 soportan las declaraciones de control dentro de los bloques {% .. %}, en este ejemplo hago uso de una condicional IF para ocultar y mostrar ciertas cosas, pero podemos incluso ir mas aya, podemos reutilizar porciones de vistas y cargarlas en otras plantillas, esto es simple con la declaración de control block.
El bloque extends establece el enlace de herencia entre las dos plantillas, para que jinja2 sepa que necesita tomar hello.html también debe de incluir base.html.
Como ultima acotación no se nos deben de olvidar de cerrar las declaraciones, o sino tendremos un error al renderizar los templates.

Generando formularios con flask-wtf
Flask y WTForms. Permiten la creación y administración más sencilla de formularios web, genera automáticamente un campo oculto de token CRSF en sus plantillas (para protegernos contra ataques Cross Site Request Forgey). También cuenta con funciones de validación de forma rápida y fácil.

Gestión de usuarios con flask-login
Si queremos tener un login en nuestra aplicación debemos crear una instancia de la clase LoginManager, la cuál debe ser accesible desde cualquier punto de nuestra aplicación. Esta clase contiene la lógica para cargar un usuario a partir del ID guardado en la sesión o redirigir a los usuarios que no están autenticados a la página de login cuando intentan acceder a una vista protegida.
Dado que Flask-login hace uso de la sesión para la autenticación, debemos establecer la variable de configuración SECRET_KEY.

Despliegue
Para la parte del despliegue me gusto mucho este tutorial (coloco en enlace para no hacer mas largo este post), yo lo seguí y no tuve ningún problema.
Se que estoy tocando solo lo superficial de este fantástico framework, pero con lo que he visto y probado me ha quedado mas que suficiente en considerarlo en futuros proyectos.
Saludos.