Webs basadas en Python

Despliegue de webs escritas en python con acceso a bases de datos y cache.

Objetivos

Python es otro lenguaje de programación muy popular. Muchas webs y aplicaciones están programadas en Python. Tenemos que aprender cómo se instala un web escrita en python.

1 - Introducción

Objetivo

Introducción al despliegue de webs con python

Python

Python es un lenguaje:

  • Interpretado
  • Alto nivel
  • Multiparadigma, ya que soporta orientación a objetos, programación imperativa y programación funcional.
  • Multiplataforma
  • https://www.python.org/

Entornos virtuales Python

Entorno virtual: “espacios aislados” (directorio) donde poder instalar distintas versiones de programas y paquetes python. Nos permiten:

  • Utilizar versiones de paquetes python que no son las que vienen empaquetadas oficialmente en nuestra distribución linux
  • Acercar los entornos de desarrollo, prueba y producción.
  • Tener en producción vaias aplicaciones con versiones de librerías pythons distintas.

Entronos virtuales Python

Uso general (en Ubuntu). Por defecto ya está instalado python3. Puede

$ sudo apt-get install python3-venv 
$ python3 -m venv env
$ source env/bin/activate
(env)$ pip install <paquete>  # Instala paquetes en el entorno virtual
(env)$ pip install -r requirements.txt  # Instala paquetes desde un archivo requirements
(env)$ deactivate
$

Generar el archivo de requisitos (paquetes y versiones que usa el entorno)

(env)$ pip freeze > requirements.txt

Recuerda introducir siempre la carpeta del entorno virtual en el fichero .gitignore para que no se suba al repositorio. Sólo tienes que incluir el fichero requirements.txt.

Introducción al protocolo WSGI

¿Cómo podemos hacer que un servidor web como apache2 sea capaz de servir una aplicación escrita en python?

  • Para ello se utiliza un protocolo que nos permite comunicar al servidor web con la aplicación web: WSGI (Web Server Gateway Interface).
  • WSGI define las reglas para que el servidor web se comunique con la aplicación web.

Introducción al protocolo WSGI

Para que un servidor web o un servidor de aplicaciones pueda ejecutar el código python:

  • El servidor accede a un único fichero (fichero de entrada). Este fichero se llama fichero WSGI.
  • La aplicación web python con la que se comunica el servidor web utilizando el protocolo WSGI se debe llamar application. Por lo tanto el fichero WSGI entre otras cosas debe nombrar a la aplicación de esta manera.

Ejemplo de fichero WSGI

Para una aplicación flask podemos tener un fichero wsgi.py con el siguiente contenido:

from programa import app as application
  • programa corresponde con el nombre del módulo, es decir del fichero del programa, en nuestro caso se llama programa.py.
  • app corresponde a la aplicación flask creada en programa.py: app = Flask(__name__).
  • Importamos la aplicación flask, pero la llamamos application, necesario para que el servidor web pueda enviarle peticiones.

Configuración de servidores web

  • Si tenemos apache2 podemos usar el módulo wsgi: libapache2-mod-wsgi-py3.
  • Con apache2 y nginx podemos usar un servidor de aplicación python: Lista. Vamos a usar uwsgi.
  • En este caso el contenido estático lo devuelve el servidor web y la ejecución del código python lo hace uwsgi. El servidor web hará de proxy inverso para que podamos acceder a la aplicación.

Frameworks python

Un framework es una aplicación, que nos ayuda en el desarrollo de aplicaciones web. Ejemplos de frameworks python: flask, django,…

Django

Django es un framework de desarrollo web de código abierto, escrito en Python, que respeta el patrón de diseño conocido como modelo–vista–controlador (MVC).

El modelo MVC es un patrón de diseño software que separa los datos de la aplicación, la lógica del programa y la representación de la información:

  • El Modelo: Es la representación de la información con la cual el sistema opera, por lo tanto gestiona todos los accesos a dicha información.
  • El Controlador: Es la parte del programa donde se implementa la lógica y las funciones de la aplicación.
  • La Vista: Representa la información ofrecida por la aplicación en un formato adecuada.

Lista de cms desarrollados en Django

2 - Entorno básico con apache2 + mod_wsgi

Objetivo

Documentación

¿Qué es WSGI?

Pasos instalación

Levanta una máquina vagrant Ubuntu (la Ubuntu-22.04 que estás usando por ejemplo) e instala apache2, git, python3 y python3-venv si no está instalado.

Clonar el repositorio

En /var/www/

$ sudo git clone https://github.com/lmorillas/flask_temperaturas.git

Prepara máquina virtual para entornos de python

En /var/www/flask_temperaturas ejecuta:

$ python3 -m venv env   # Crea un entorno virtual
$ source env/bin/activate  # Activa el entorno virtual
$ cd flask_temperaturas
$ pip install -r requirements.txt  # Instala dependencias

Instala y configura el módulo wsgi para apache2

$ sudo  apt install libapache2-mod-wsgi-py3

Activar el módulo wsgi

Nuestra aplicación se encuentra en /var/www/flask_temperaturas. Nuestro entorno virtual está en /var/www/flask_temperaturas/env.

Creación del fichero wsgi

Lo primero que vamos a hacer es crear el fichero WSGI, que vamos a llamar wsgi.py estará en /var/www/flask_temperaturas y tendrá el siguiente contenido:

    from app import app as application

Explicación:

  • El primer app corresponde con el nombre del módulo, es decir del fichero del programa, en nuestro caso se llama app.py.
  • El segundo app corresponde a la aplicación flask creada en app.py: app = Flask(__name__).
  • Importamos la aplicación flask, pero la llamamos application necesario para que el servidor web pueda enviarle peticiones.

Configuración de apache2

Yo he utilizado el virtualhost por defecto, si usamos otro virtualhost esta configuración ira en el fichero correspondiente:

    WSGIDaemonProcess flask_temp python-path=/var/www/flask_temperaturas:/var/www/flask_temperaturas/env/lib/python3.10/site-packages
    WSGIProcessGroup flask_temp
    WSGIScriptAlias / /var/www/flask_temperaturas/wsgi.py process-group=flask_temp
    <Directory /var/www/flask_temperaturas>
            Require all granted
    </Directory>

Fíjate en la ruta /var/www/flask_temperaturas/env/lib/python3.10/site-packages Si usas otra versión de python, tendrás que cambiarla.

Vamos a explicar la configuración:

  • El DocumentRootse indica el directorio donde está la aplicación. Realmente el servidor web siempre va a llamar al fichero WSGI wsgi.py, pero el DocumentRoot es necesario por si hay contenido estático.
  • La directiva WSGIDaemonProcess: Se define un grupo de procesos que se van a encargar de ejecutar la aplicación (servidor de aplicaciones). A estos procesos se le ponen un nombre (flask_temp) y se indica los directorios donde se encuentran la aplicación y los paquetes necesarios (python-path), como puedes observar se pone el directorio donde esta la aplicación y el directorio donde se encuentran los paquetes en el entorno virtual, separados por dos puntos.
  • WSGIProcessGroup: Nos permite agrupar procesos. Se pone el misimo nombre que hemos definido en la directiva anterior.
  • La directiva WSGIScriptAlias nos permite indicar que programa se va a ejecutar (el fichero WSGI: /var/www/flask_temperaturas/wsgi.py) cuando se haga una petición a la url / y que proceso lo va a ejecutar.

La carpeta /var/www/flask_temperaturas debe tener los siguientes permisos:

$ sudo chown -R www-data:www-data /var/www/flask_temperaturas

Reinicia el servicio web y prueba el funcionamiento. Si te da algún erro 500 puedes ver los errores, en /var/log/apache2/error.log.

3 - Despliegue con Gunicorn

Objetivo

Documentación

Gunicorn es un servidor web que permite ejecutar una aplicación en un proceso independiente. Usamos los servidores web como proxies inversos que envían la petición python al servidor WSGI que estemos utilizando

Configuración Vagrant

Configura el forward del puerto 8080 al puerto 8080 de la máquina virtual

Instalar Gunicorn

En /home/vagrant/

Activa en entorno virtual

source env/bin/activate
pip install gunicorn

(env) /home/vagrant/flask_temperaturas$ gunicorn -w 2 -b :8080 wsgi

Comprueba con tu navegador que puedes acceder al puerto 8080 y que responde ahora gunicorn

Sigue la documentación base

Atento porque puede cambiar alguna dirección

  • Crea un servicio en systemd
  • Activa e inicia el servicio
  • Configura Apache2 compo un proxy inverso.

Comprueba con tu navegador que puedes acceder al puerto 8000 y que resonde apache. Elimina el forward del puerto 8080 y reinicia vagrant. Comprueba que la aplicación sigue funcionando.

4 -