Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 1 livre papier acheté 
= la version en ligne automatiquement offerte. Cliquez ici

Créer un environnement de travail en 10 minutes

Description de l’application à construire

Dans les chapitres suivants, nous allons construire une application en plusieurs parties, le but du jeu étant de montrer qu’une application peut avoir une interface web (chapitre Créer une application web en 30 minutes), une interface graphique (chapitre Créer une application graphique en 20 minutes) et une interface console (chapitre Créer une application console en 10 minutes) et partager les données.

L’application dans sa globalité est un simple formulaire de contact.

La solution web retenue est Pyramid, qui est un framework web utilisant différents modules Python éprouvés qu’il agrège et sur lesquels il s’appuie pour offrir une solution fiable, mais très souple.

En effet, il existe dans l’univers Python pour le Web une grande multitude de modules concurrents pour chaque aspect du Web : solution d’authentification, de routage, de gestion de données, de génération de pages web (templating)...

Le découplage de ces modules est une des forces de ce framework qui fait de lui l’outil idéal des artisans du web.

La solution persistante que nous allons utiliser est PostgreSQL, mais il est tout à fait possible d’utiliser MySQL ou encore, mais juste pour le développement, SQLite.

La solution que nous allons utiliser pour l’interface graphique sera GTK+. En effet, la solution usuelle est celle qui est incluse dans le langage Python, à savoir TkInter, et il existe déjà beaucoup de tutoriels qui en parlent. GTK est une bibliothèque plus généraliste, utilisée pour créer les applications sous Debian ou Ubuntu (par exemple) et permettant de répondre à tous les besoins modernes.

Enfin, pour l’interface console, nous allons utiliser des bibliothèques...

Containers

Nous allons utiliser Docker et Docker compose. Pour les installer, voici les différentes pages utiles de la documentation officielle :

Si vous êtes sous Windows, il est recommandé d’installer WSL en utilisant Debian ou Ubuntu comme distribution par défaut, puis docker-desktop depuis le Windows Store et de l’activer sous WSL. Par la suite, vous utiliserez WSL pour toutes les opérations.

1. Portainer

Avant même de commencer à penser à notre application, il faut aller mettre en place les différents containers dont on a besoin. Le premier est un outil qui nous permet de gérer facilement, via une interface web, nos containers.

Voici l’extrait du fichier docker-compose.yml le concernant :

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: 

Il faut positionner ce fichier à la racine de votre projet. Le point important est la section volumes et le fait que le container va partager avec votre machine le fichier /var/run/docker et donc que le portainer sera connecté au Docker de votre machine.

Une fois ceci effectué, il faut lancer la commande suivante dans une invite de commandes dans le répertoire source du projet :

$ docker compose up -d 

Une fois ceci fait, il faut aller rapidement sur https://localhost:9443 et finaliser l’installation en déployant la configuration locale (un bouton à cliquer) ; rapidement car, après...

Créer son container Docker

Créer un container Docker permet de gérer tout son environnement, de la version de l’OS aux bibliothèques système installées, dont la version de Python. On peut alors utiliser la version système de Python, sachant qu’elle ne sert que pour notre application.

Nous configurerons notre propre container ainsi :

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: 

Pour des raisons de préférences personnelles, j’utilise PostgreSQL, mais il est possible avec peu de changement de faire dépendre notre container de MySQL à la place, en mettant à jour la dépendance, le lien et surtout les variables d’environnement.

À présent, il ne manque qu’un seul élément à notre container :...

Installer ses bibliothèques Python

Une fois le container opérationnel, il est possible de lancer un terminal en son sein soit depuis portainer, soit depuis la console en tapant la commande suivante :

$ docker compose run projetct_main bash 

Une fois à l’intérieur, la toute première fois, il faut initialiser poetry :

$ poetry init 

Cette commande va vous poser un certain nombre de questions, puis va vous proposer d’installer un certain nombre de bibliothèques. Pour chacune, vous allez saisir un nom à rechercher, puis un numéro dans la liste des résultats de la recherche et, enfin, une contrainte. Vous pouvez aussi installer les fichiers à l’aide de :

$ poetry add chameleon 
$ poetry add "sqlalchemy<2.0" 

Une fois toutes les dépendances activées, vous pourrez faire :

$ poetry install 

puis aller réactiver les deux premières lignes commentées dans le fichier Dockerfile (la suivante ainsi que la ligne commentée dans le fichier docker-compose.yml devront être décommentées lorsque le projet principal sera créé).

Vous pourrez ainsi vérifier que le container se crée bien en relançant la commande :

$ docker compose up -d 

Attention : si vous avez une erreur avec poetry, il y a globalement deux explications : soit vous demandez l’impossible (installer un paquet qui dépend de xxx version inférieur à 1 et un autre qui dépend de xxx version supérieur à 1, par exemple, ce qui n’est pas resoluble) ou alors l’installation d’un des paquets échoue car il vous manque une bibliothèque (dépendance système libxxx-dev). À ce moment-là, il faudra identifier cette dépendance et la rajouter dans la recette Dockerfile.

Vous êtes maintenant...