De Data Science a Intelligent Apps (I)

Con bastante frecuencia, cuando trabajamos en lo que se suele denominar ‘Analítica avanzada’, solemos centrarnos en el desarrollo de un algoritmo que resuelve un problema. Por ejemplo, un algoritmo que nos recomiende una serie de películas en base al histórico que se pueda tener de la actividad de muchos usuarios.

En estos casos, se suele entrenar el algoritmo y, una vez que la precisión de dicho algoritmo es lo suficientemente buena, se empaqueta para que pueda ser utilizado por desarrolladores (por ejemplo en una web de compra de películas).

Es decir, se establece una frontera entre lo que supuestamente hace un «científico de datos» y un desarrollador web.

El objetivo de esta entrada de blog es presentar un entorno de desarrollo web que:

  1. debido a su sencillez, permita a un ‘científico de datos’ desarrollar web apps que utilicen los algoritmos que anteriormente se han desarrollado, haciendo mucho más interesante y completo su trabajo;
  2. al estar basado en python, facilite la transición de un «científico de datos» que pueda ya estar familiarizado con dicho lenguaje de programación y pasar de desarrollar algoritmos al desarrollo web.

Dicho entorno de trabajo va a incluir:

  1. Python Flask. Librería para desarrollo web basada en python.
  2. Python VirtualEnv. Librería python para la creación de entornos virtuales. Parecido a Anaconda.
  3. Apache web server

En esta primera parte de nuestra entrada de blog vamos a enumerar los pasos necesarios para preparar el entorno, es decir, instalar VirtualEnv, cómo crear la aplicación flask en VirtualEnv y, finalmente, como desplegarla en producción (en Apache web server). En futuras entradas, desarrollaremos algún ejemplo de lo que se suele llamar una «Intelligent App».

Para explicar dicha preparación, vamos a desarrollar en local una simple aplicación Flask y la vamos a desplegar en un servidor web Apache.

Supuestos:

  1. Cuenta en GitHub
  2. Disponibilidad de Python 2.7
  3. Entorno local con Ubuntu 16.01 en adelante
  4. Disponibilidad de un virtual environment con Ubuntu Server 16.04.1 x64 (yo utilizo DigitalOcean debido a su simplicidad)

Los pasos que detallo a continuación están sacados de Frederik De Blesser

 

PASO 1. Instalar tanto en local como en Ubuntu Server Python VirtualEnv 


Primero instalamos pip en caso de que no lo tengamos

sudo apt-get install python-pip

Ahora instalamos virtualenv con pip

sudo pip install virtualenv

Sólo en local, crear un nuevo proyecto con VirtualEnv

virtualenv --no-site-packages primerFlask

Esto creará una carpeta «primerFlask» que tendrá dentro un entorno de python independiente de la instalación global. El «–no-site-packages» implica que la instalación será completamente independiente ya que no utilizará ninguna librería de la instalación global

 

PASO 2. Instalar Flask en nuestro entorno primerFlask en local


cd primerFlask
source bin/activate #esto activa nuestro entorno primerFlask. 
                    #Mientras esté activado todo lo que instalemos
                    #se hará dentro de dicho entorno
pip install flask

 

PASO 3. Crear aplicación flask en local


vim primerFlask.py #esto abre vim editor para poder crear la aplicación
from flask import Flask
app = Flask(__name__)
@app.route("/")
def holamundo():
    return "Hola mundo!"
if __name__=="__main__":
    app.run()

Con mayúsculas + ZZ se cierra y se guarda el archivo editado con vim

 

PASO 4. Ejecutar la aplicación en local para comprobar que todo está bien (asegurarse de que el entorno primerFlask esta todavía activado)


python primerFlask.py

En el terminal puedes hacer click sobre la url que aparece y se debería abrir un navegador con la frase «Hola mundo!». Perfecto, ya tenemos nuestra primera aplicación flask lista!

 

PASO 5. Crear el archivo requirements.txt que contendrá la información de los paquetes que tienen que estar instalados en nuestro entorno primerFlask para que la aplicación pueda funcionar


 pip freeze > requirements.txt

A estas alturas podemos desactivar nuestro entorno virtual nuevo flask

deactivate

 

PASO 6. Creación del archivo WSGI (Web Server Gateway Interface) en local


Crear un archivo llamado primerFlask.wsgi e introducir

import os, sys
PROJECT_DIR = '/var/www/primerFlask/primerFlask'
activate_this = os.path.join(PROJECT_DIR,'bin','activate_this.py')
execfile(activate_this, dict(__file__=activate_this))
sys.path.append(PROJECT_DIR)
from primerFlask import app as application

PROJECT_DIR se refiere a un directorio que crearemos después en nuestro web server Apache.

Llega la hora de subir nuestros archivos al servidor web Apache. Para ello utilizaremos GitHub

 

PASO 7. Crear repositorio primerFlask y sincronizar contenido de dicho repositorio


Antes que nada, crear un archivo .gitignore para hacer saber a git que es lo que tiene que excluir a la hora de sincronizar los repositorios de local a github. Para nuestra aplicación, el archivo contendrá lo siguiente:

# virtualenv
*.pyc
local
bin
lib
include

Como todavía estamos dentro de la carpeta primerFlask en local

git init
git add .
git commit -m "Initial commit"
git remote add origin git@github.com:<nombre usuario github>/<nombre de repositorio>.git
git push -u origin master

Ya estamos sincronizados entre local y el repositorio de github

 

PASO 8. Despliegue en servidor web


Como ya expliqué antes, el servidor virtual lo tengo en DigitalOcean

Nos vamos a nuestro servidor virtual

cd /var/www/
mkdir -p primerFlask #creamos un directorio que contendrá nuestra aplicación
cd primerFlask
git clone git@github.com:<nombre usuario github>/<nombre de repositorio>.git
virtualenv primerFlask
cd primerFlask
source bin/activate #activamos nuestro virtualenv
pip install -r requirements.txt # esto instala en nuestro virtualenv las librerias 
                                #necesarias para ejecutar nuestra aplicación
deactivate # ya podemos desactivarlo

A estas alturas nuestros directorios quedarían de la siguiente manera:

/var/www/                                                                #root de todas las sites

                  primerFlask/                                           #nuestro dominio

                          primerFlask/                                   #nuestro directorio python

                                                primerFlask.py           #archivo python

                                                primerFlask.wsgi         #archivo wsgi

Ahora tenemos que crear un archivo virtual host para nuestra aplicación

vim /etc/apache2/sites-available/primerFlask.conf

Introducir en archivo

<VirtualHost *:80>
  WSGIScriptAlias / /var/www/primerFlask/primerFlask/primerFlask.wsgi
  WSGIDaemonProcess primerFlask
  <Directory /var/www/primerFlask/primerFlask>
    WSGIProcessGroup primerFlask
    WSGIApplicationGroup %{GLOBAL}
    Order deny,allow
    Allow from all
  </Directory>
</VirtualHost>

Activar este virtual host

a2ensite primerFlask.conf
service apache2 reload #reiniciar Apache

Voila! Si introduces en un navegador la IP de tu servidor, deberías ver el ansiado Hola mundo!