En este post vamos a ver una breve introducción a la herramienta Flask, un microframework para la creación de aplicaciones web.
Prerrequisitos
Se recomienda tener un conocimiento medio del lenguaje de programación Python, en su versión 2, así como el uso de PyPI y de alguna distribución de GNU/Linux, en este caso los ejemplos estarán orientados a la distribución Debian. Este último requisito, el del sistema operativo, es recomendable aunque también es posible seguir el proceso en un sistema Windows o MacOS, pero algunos de los ejemplos serán distintos como la instalación de Flask. Para estos casos, es recomendable ver la guía de inicio de Flask.
Instalación
Python y pip
Si aún no tienes instalado alguno de estos dos componentes, lo puedes hacer abriendo un terminal e invocando:
# apt-get install python2.7 python-pip.
Flask
Como se puede suponer, para instalar este componente usaremos PyPI, invocando la siguiente sentencia:
$ pip install Flask
Se instalará Flask con sus dependencias, por lo que puede que tarde un tiempo en completarse la operación.
Virtualenv
Este paso es opcional pero altamente recomendable aunque solo para fines de desarrollo, no de producción. Virtualenv es un entorno virtual (como bien se puede suponer) para separar las librerías instaladas de forma global en el sistema con las de un proyecto, tener distintas versiones de un mismo paquete…
Para ello, hay que ejecutar:
# apt-get install python-virtualenv
Crear entorno virtual
Para ello hay que crear una carpeta la cual nos servirá para albergar nuestro proyecto de Flask y acto seguido ejecutaremos virtualenv:
$ mkdir MiProyectoFlask
$ cd MiProyectoFlask
$ virtualenv venv
Después hay que activar virtualenv, para acceder a la consola virtual también y poder tener las ventajas que esto ofrece (algunas de ellas dichas anteriormente):
$ . venv/bin/activate
Como se puede ver en la terminal, en la línea de escritura se ha añadido una marca “(venv)” que significa que estamos en dicho entorno. Ahora hay que instalar Flask igual que se ha dicho antes, solo que ahora en el entorno virtual y no de forma global en el sistema.
Crear una app
El siguiente paso es el de creación del archivo fuente en el que se albergará el contenido de nuestra aplicación. En la carpeta raíz del proyecto basta con crear un nuevo archivo `app.py` con nuestro editor de textos favorito, como puede ser Vim.
Con fines puramente didácticos se creará la típica aplicación Hola Mundo para ver cómo se crea un proyecto Flask. En el fichero creado, añadimos las siguientes líneas:
from flask import Flask # Importar la biblioteca app = Flask(__name__) @app.route('/') # Ruta de la app web, en este caso la raíz de la página web def hello_world(): return 'Hola Mundo'
Acto seguido ejecutamos la aplicación con:
$ flask run
En la terminal se mostrará una dirección web local, a través de la cual accederemos desde un navegador web. En la pantalla se mostrará el mensaje “Hola Mundo”, en una página web vacía.
Para añadir más páginas en nuestra web, tan solo hay que definir una nueva función (como se hace de forma normal en Python) y en la línea anterior introducir la sentencia `@app.route(RUTA)` donde _RUTA_ se refiere a la dirección de la web.
Conceptos varios
Mostrar HTML
Es posible añadir páginas web estáticas, que tengamos almacenadas en formato HTML. Para ello basta con guardar el fichero HTML en un directorio hijo del raíz del proyecto llamado _templates_ y añadir las siguientes líneas:
# from flask import render_template
# @app.route('/info/')
# def hello():
# return render_template('info.html')
Donde info.html es el documento a mostrar. La función usada puede recibir más parámetros e incluso decidir que parte mostrar del HTML según dichos parámetros, por ejemplo, en un documento usando Jinja2.
Extensiones
Flask base, es decir, sin extensiones instaladas tiene una potente funcionalidad pero limitada. Para ello, se han creado una serie de extensiones que amplían las capacidades de este programa, desde soporte para REST hasta para formularios o correo electrónico.
Para instalar una extensión lo más cómodo es usar PyPI, por ejemplo para añadir soporte de correo electrónico es posible instalar Flask-Mail, de la siguiente forma:
$ pip install Flask-Mail
Usando Cloud VPS
Todo lo visto hasta hora ha sido ejecutado en una máquina local, sin estar a disposición de Internet. Lógicamente, al crear una aplicación web la intención es publicarla cuando esté lista, por lo que debemos seguir una serie de pasos para publicarla en nuestro Cloud VPS. Para la implementación en un servidor, es recomendable tener algún conocimiento de Apache además de los anteriormente descritos.
Para ello, creamos un nuevo VPS, con una distribución GNU/Linux (Debian, por ejemplo). Los requisitos de procesador y memoria RAM dependerán del procesamiento que necesite nuestro código, así como la cantidad de usuarios que se conectarán al mismo tiempo a nuestra web. Python en sí es un lenguaje que suele necesitar más recursos, en contraste con otros como C, por lo que hay que medir bien estos recursos. En cuanto al disco dependerá si tenemos una base de datos, y de los archivos de nuestra propia aplicación, siendo esta memoria más fácil de medir.
Es obvio que para poder correr dicha app en el servidor hay que instalar los mismos paquetes que en la máquina local, por lo que se suponen instalados. Para implementar nuestra aplicación nos ayudaremos de `mod_wsgi`, un módulo de Apache. Para instalarlo:
# apt-get install apache2 libapache2-mod-wsgi` y reiniciamos el servidor Apache `# systemctl restart apache2
Y ejecutarlo:
# a2enmod wsgi
Después crearemos (o copiaremos) nuestra aplicación Flask, como se ha explicado anteriormente, con una salvedad: en vez de crear el punto de partida de la aplicación en `app.py` lo haremos en `/var/www/MiProyectoFlask/MiProyectoFlask/__init__.py` (sí, hay un directorio hijo igual que el padre, no es un error). Activamos nuestro virtualenv como se ha dicho antes también. Para ejecutarlo lo hacemos de la siguiente forma:
# python __init__.py
Deberemos ver un mensaje de la misma forma que en nuestro ordenador local, mostrando una dirección local (aunque sea en el servidor, vamos bien).
Desactivamos el virtualenv con:
# desactivate
Ahora es el momento de crear el archivo .wsgi para nuestro servidor Apache. Para ello nos movemos hasta `# cd /var/www/MiProyectoFlask` y creamos un archivo `miproyectoflask.wsgi`, con el siguiente contenido:
#!/usr/bin/python
import sys
sys.path.insert(0,"/var/www/MiProyectoFlask/")
from MiProyectoFlask import app as application
Por último toca configurar Apache. Primero configuramos el host virtual, para ello con el editor de textos que prefiramos abrimos el archivo (no existente aún) `/etc/apache2/sites-available/MiProyectoFlask.conf`, y escribimos en el las siguientes líneas:
<VirtualHost *>
ServerName example.com
WSGIScriptAlias / /var/www/MiProyectoFlask/miproyectoflask.wsgi
<Directory /var/www/MiProyectoFlask>
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
Y lo ejecutamos:
# a2ensite MiProyectoFlask
# service apache2 restart
Antes de poder ver el resultado, hay que configurar de la manera deseada el firewall de nuestro servidor, permitiendo el acceso HTTP, por ejemplo del siguiente modo:
Acceso
Esto permite el acceso desde cualquier IP, es posible que en un caso particular esto no sea lo deseado así que hay que configurarlo con cuidado.
Y por fin podemos ver nuestra aplicación, en este caso el _Hola Mundo_:
Solución de problemas
Es posible que a la hora de ejecutar la orden `# sevice apache2 restart` se nos muestre el siguiente error por pantalla:
Job for apache2.service failed because the control process exited with error code.
See "systemctl status apache2.service" and "journalctl -xe" for details. Para ver con mayor detalle la causa de esta situación, es útil ejecutar: `# systemctl status apache2.service` para ver el log de Apache. Puede que obtengamos un mensaje como el siguiente:
prueba systemd[1]: Starting The Apache HTTP Server...
prueba apachectl[981]: AH00112: Warning: DocumentRoot [/var/www/html] does not exist.
Para solucionarlo, basta eliminar el archivo /etc/apache2/sites-enabled/000-default.conf.
Documentación
Este microframework ofrece una infinidad de características más. Algunas de ellas se pueden consultar en la documentación de Flask, así como una serie de manuales útiles.