Crear un entorno de trabajo en 10 minutos
Descripción de la aplicación para construir
En los siguientes capítulos vamos a construir una aplicación en varias partes con el propósito de demostrar que una aplicación puede tener una interfaz web (capítulo Crear una aplicación web en 30 minutos), una interfaz gráfica (capítulo Crear una aplicación gráfica en 20 minutos) y una interfaz de consola (capítulo Crear una aplicación de consola en 10 minutos) y compartir los datos.
La aplicación en su totalidad es un simple formulario de contacto.
La solución web adoptada es Pyramid, un framework web que usa distintos módulos de Python probados que agrega y en los que se apoya para ofrecer una solución fiable, aunque muy ligera.
De hecho, en el universo Python para la web, existe una gran cantidad de módulos concurrentes para cada aspecto de la web: solución de autentificación, de enrutamiento de gestión de datos, de generación de páginas web (creación de plantillas), etc.
El desacoplamiento de estos módulos es uno de los puntos fuertes de este framework, lo que lo convierte en la herramienta ideal para los creadores web.
La solución persistente que vamos a usar es PostgreSQL, pero también es posible usar MySQL o incluso, pero solo para el desarrollo, SQLite.
La solución que vamos a usar para la interfaz gráfica será...
Contenedores
Vamos a usar Docker y Docker compose. Para instalarlos, estas son las distintas páginas útiles de la documentación oficial:
Si utiliza Windows, se recomienda instalar WSL usando Debian o Ubuntu como distribución por defecto, luego Docker Desktop desde Microsoft Store y activarlo bajo WSL. Después, usará WSL para todas las operaciones.
1. Portainer
Incluso antes de empezar a pensar en nuestra aplicación, hay que establecer los distintos contenedores que necesitamos. El primero es una herramienta que nos permite gestionar nuestros contenedores con facilidad mediante una interfaz web.
Aquí podemos ver un extracto del archivo docker-compose.yml relacionado con este tema:
version: '3.3'
services:
portainer:
image: portainer/portainer-ce:latest
ports:
- 9443:9443
volumes:
- portainer_data:/data
- /var/run/docker.sock:/var/run/docker.sock
restart: unless-stopped
volumes:
portainer_data
Hay que colocar este archivo en la raíz del proyecto. Lo importante es la sección volumes y el hecho de que el contenedor va a compartir con nuestra máquina el archivo /var/run/docker y, por lo tanto, el portainer estará conectado con el Docker de nuestra máquina.
Una vez hecho esto, hay que ejecutar el comando siguiente en una línea de comandos dentro del directorio fuente del proyecto:
$ docker compose up -d
Una vez hecho esto, hay que ir rápidamente a https://localhost:9443 y finalizar la instalación desplegando la configuración local (un botón para hacer clic); rápidamente porque, después del comando anterior, hay un tiempo limitado para acceder a Portainer. Si tarda demasiado, habrá que volver a ejecutar este mismo comando. Añadamos también el hecho de que la URL debe especificar HTTPS, no hay redirección automática.
Vista de la herramienta portainer
Ahora puede ir a ver las variables de entorno o los parámetros de un contenedor, sus registros o incluso acceder a una consola desde esta herramienta.
2. Base de datos
Se puede usar MySQL, PostgreSQL o incluso SQLite. Para este último, será suficiente...
Crear su contenedor Docker
Crear un contenedor Docker permite gestionar todo el entorno, desde la versión del SO hasta las bibliotecas de sistema instaladas; uno de esos elementos es la versión de Python. Entonces se puede usar la versión de sistema de Python, pero sabiendo que solo sirve para nuestra aplicación.
Configuraremos nuestro propio contenedor de la siguiente manera:
services:
project_main:
container_name: project_main
build:
context: .
dockerfile: ./Dockerfile
# command: pserve development.ini
tty: true
ports:
- "6543:6543"
volumes:
- ".:/home/pythoniste"
- data:/home/pythoniste/project/data
restart: unless-stopped
links:
- project_postgres
depends_on:
- project_postgres
environment:
- POSTGRES_HOST=project_postgres
- POSTGRES_PORT=5432
- POSTGRES_DB=project
- POSTGRES_USER=project
- POSTGRES_PASSWORD=secret
volumes:
data:
Por motivos de preferencias personales, uso PostgreSQL, pero con unos pocos cambios es posible hacer de MySQL en su lugar, actualizando la dependencia, el vínculo y, principalmente las variables de entorno....
Instalar sus bibliotecas Python
Una vez que el contenedor está operativo, es posible lanzar un terminal en su interior desde portainer o desde la consola tecleando el siguiente comando:
$ docker compose run projetct_main bash
Una vez en el interior, la primera vez hay que inicializar poetry:
$ poetry init
Este comando le hará varias preguntas y luego le ofrecerá instalar varias bibliotecas. Para cada una de ellas, escribirá un nombre para buscar, después un número en la lista de resultados de la búsqueda y, finalmente, una limitación. También puede instalar los archivos con ayuda de:
$ poetry add chameleon
$ poetry add "sqlalchemy<2.0"
Una vez activadas todas las dependencias, podrá hacer:
$ poetry install
luego reactive las dos primeras líneas comentadas dentro del archivo Dockerfile (la siguiente, así como la línea comentada dentro del archivo docker-compose.yml, deberán ser descomentadas cuando se cree el proyecto principal).
Podrá verificar que el contenedor se crea bien volviendo a ejecutar el comando:
$ docker compose up -d
Cuidado: si tiene un error con poetry, a nivel global hay dos explicaciones: usted pide lo imposible (instalar un paquete que depende de xxx versión inferior a 1 y otro que depende de xxx versión superior a 1, por ejemplo, algo que es irresoluble) o que la instalación de uno de los paquetes fracasa porque...