En aquest article veurem una breu introducció a l'eina Flask, un microframework per a la creació d'aplicacions web.
Prerequisits
Es recomana tenir un coneixement mitjà del llenguatge de programació Python, en la versió 2, així com de l'ús de PyPI i d'alguna distribució de GNU/Linux; en aquest cas, els exemples estaran orientats a la distribució Debian. Aquest últim requisit, el del sistema operatiu, és recomanable, tot i que també és possible seguir el procés en un sistema Windows o MacOS, però alguns dels exemples seran diferents, com ara la instal·lació de Flask. En aquests casos, és recomanable consultar la guia d'inici de Flask.
Instal·lació
Python i pip
Si encara no tens instal·lat algun d'aquests dos components, ho pots fer obrint un terminal i executant:
# apt-get install python3 python3-pipFlask
Com es pot suposar, per instal·lar aquest component farem servir PyPI, executant la sentència següent:
$ pip install FlaskS'instal·larà Flask amb les seves dependències, de manera que l'operació pot trigar una estona a completar-se.
Virtualenv
Aquest pas és opcional però molt recomanable, tot i que només per a finalitats de desenvolupament, no de producció. Virtualenv és un entorn virtual (com es pot suposar) per separar les biblioteques instal·lades globalment al sistema de les d'un projecte, tenir diferents versions d'un mateix paquet…
Per fer-ho, cal executar:
# apt-get install python-virtualenv o # python3-venvCrear un entorn virtual
Per fer-ho, cal crear una carpeta que servirà per allotjar el nostre projecte de Flask i tot seguit executarem virtualenv:
$ mkdir MiProyectoFlask
$ cd MiProyectoFlask
$ virtualenv venvDesprés cal activar virtualenv per accedir també a la consola virtual i poder gaudir dels avantatges que ofereix (alguns dels quals ja s'han esmentat):
$ . venv/bin/activateCom es pot veure al terminal, a la línia d'entrada s'ha afegit una marca “(venv)” que significa que som en aquest entorn. Ara cal instal·lar Flask tal com s'ha indicat abans, però ara a l'entorn virtual i no globalment al sistema.
Crear una aplicació
El pas següent és crear el fitxer font que allotjarà el contingut de la nostra aplicació. A la carpeta arrel del projecte només cal crear un fitxer nou `app.py` amb el nostre editor de text preferit, com ara Vim.
Amb finalitats purament didàctiques es crearà la típica aplicació Hola món per veure com es crea un projecte Flask. Al fitxer creat, hi afegim les línies següents:
from flask import Flask # Importar la biblioteca
app = Flask(__name__)
@app.route('/') # Ruta de l'aplicació web, en aquest cas l'arrel de la pàgina web
def hello_world():
return 'Hola Mundo'Tot seguit executem l'aplicació amb:
$ flask runAl terminal es mostrarà una adreça web local, a la qual accedirem des d'un navegador web. A la pantalla es mostrarà el missatge “Hola Mundo”, en una pàgina web buida.
Per afegir més pàgines al nostre web, només cal definir una funció nova (com es fa normalment en Python) i a la línia anterior introduir la sentència `@app.route(RUTA)`, on _RUTA_ fa referència a l'adreça del web.
Conceptes diversos
Mostrar HTML
És possible afegir pàgines web estàtiques que tinguem emmagatzemades en format HTML. Per fer-ho, només cal desar el fitxer HTML en un directori fill de l'arrel del projecte anomenat _templates_ i afegir les línies següents:
# from flask import render_template
# @app.route('/info/')
# def hello():
# return render_template('info.html')On info.html és el document que es vol mostrar. La funció utilitzada pot rebre més paràmetres i fins i tot decidir quina part de l'HTML mostra segons aquests paràmetres, per exemple, en un document que faci servir Jinja2.
Extensions
Flask bàsic, és a dir, sense extensions instal·lades, té una funcionalitat potent però limitada. Per això s'han creat una sèrie d'extensions que amplien les capacitats d'aquest programa, des del suport per a REST fins als formularis o el correu electrònic.
Per instal·lar una extensió, el més còmode és fer servir PyPI; per exemple, per afegir suport de correu electrònic és possible instal·lar Flask-Mail, de la manera següent:
$ pip install Flask-MailÚs de Cloud VPS
Tot el que hem vist fins ara s'ha executat en una màquina local, sense estar disponible a Internet. Lògicament, quan es crea una aplicació web, la intenció és publicar-la quan estigui preparada, de manera que hem de seguir una sèrie de passos per publicar-la al nostre Cloud VPS. Per al desplegament en un servidor, és recomanable tenir alguns coneixements d'Apache a més dels descrits anteriorment.
Per fer-ho, creem un VPS nou amb una distribució GNU/Linux (Debian, per exemple). Els requisits de processador i memòria RAM dependran del processament que necessiti el nostre codi, així com de la quantitat d'usuaris que es connectaran alhora al nostre web. Python és un llenguatge que sol necessitar més recursos que d'altres com C, de manera que cal mesurar bé aquests recursos. Pel que fa al disc, dependrà de si tenim una base de dades i dels fitxers de la nostra aplicació; aquesta memòria és més fàcil de mesurar.
És obvi que, per poder executar aquesta aplicació al servidor, cal instal·lar els mateixos paquets que a la màquina local, de manera que se suposa que estan instal·lats. Per desplegar la nostra aplicació ens ajudarem de `mod_wsgi`, un mòdul d'Apache. Per instal·lar-lo:
# # apt-get install apache2 libapache2-mod-wsgi-py3 y reiniciamos el servidor Apache `# systemctl restart apache2I executar-lo:
# a2enmod wsgiDesprés crearem (o copiarem) la nostra aplicació Flask, tal com s'ha explicat anteriorment, amb una excepció: en lloc de crear el punt d'entrada de l'aplicació a `app.py`, ho farem a `/var/www/MiProyectoFlask/MiProyectoFlask/__init__.py` (sí, hi ha un directori fill amb el mateix nom que el pare, no és cap error). També activem el nostre virtualenv tal com s'ha indicat abans. Per executar-lo ho fem de la manera següent:
# python __init__.pyHauríem de veure un missatge com el del nostre ordinador local, que mostri una adreça local (encara que sigui al servidor, anem bé).
Desactivem virtualenv amb:
# deactivateAra és el moment de crear el fitxer .wsgi per al nostre servidor Apache. Per fer-ho, ens desplacem fins a `# cd /var/www/MiProyectoFlask` i creem un fitxer `miproyectoflask.wsgi`, amb el contingut següent:
#!/usr/bin/python
import sys
sys.path.insert(0,"/var/www/MiProyectoFlask/")
from MiProyectoFlask import app as applicationFinalment toca configurar Apache. Primer configurem l'amfitrió virtual; per fer-ho, amb l'editor de text que preferim obrim el fitxer (que encara no existeix) `/etc/apache2/sites-available/MiProyectoFlask.conf`, i hi escrivim les línies següents:
<VirtualHost *>
ServerName example.com
WSGIScriptAlias / /var/www/MiProyectoFlask/miproyectoflask.wsgi
<Directory /var/www/MiProyectoFlask>
Order deny,allow
Allow from all
</Directory>
</VirtualHost>I ho executem:
# a2ensite MiProyectoFlask
# service apache2 restartAbans de poder veure el resultat, cal configurar de la manera desitjada el tallafoc del nostre servidor, permetent l'accés HTTP, per exemple de la manera següent:
Accés
Això permet l'accés des de qualsevol IP; és possible que en un cas particular això no sigui el que es vol, així que cal configurar-ho amb cura.
I finalment podem veure la nostra aplicació, en aquest cas l'_Hola món_:
Resolució de problemes
És possible que en executar l'ordre `# service apache2 restart` es mostri l'error següent a la pantalla:
Job for apache2.service failed because the control process exited with error code.Consulteu "systemctl status apache2.service" i "journalctl -xe" per obtenir més detalls. Per veure amb més detall la causa d'aquesta situació, és útil executar: `# systemctl status apache2.service` per veure el registre d'Apache. Pot ser que obtinguem un missatge com el següent:
prueba systemd[1]: Starting The Apache HTTP Server...
prueba apachectl[981]: AH00112: Warning: DocumentRoot [/var/www/html] does not exist.Per solucionar-ho, només cal eliminar el fitxer /etc/apache2/sites-enabled/000-default.conf.
Documentació
Aquest microframework ofereix una infinitat de característiques més. Algunes es poden consultar a la documentació de Flask, així com una sèrie de manuals útils.