SI : Développement Web en Python (suite)
Après avoir introduit le traitement d’un formulaire HTML à l’aide d’un script Python CGI, nous allons
poursuivre sur la configuration d’un environnement de développement, puis la mise en production d’une
application Web Python CGI.
1. Environnement de développement
Il est très facile de mettre en place un serveur de développement en Python. Nous allons d’abord
commencer par récupérer le code d’un projet dédié sur la forge logicielle Framagit. À l’aide d’un terminal
virtuel, nous exécutons la commande suivante :
git clone [email protected]:S2SIO/web/dev_server.git
1.1. Propulser du code HTML
Nous nous plaçons alors dans le dossier html du projet :
cd dev_server/html
La seule exécution de la commande suivante suffit à propulser un serveur de développement Python, qui
écoute sur le port 8000 :
python3 -m http.server
Nous chargeons alors l’adresse localhost:8000 dans le navigateur
Firefox. Par défaut, le serveur liste les fichiers présents dans le
répertoire courant (voir la figure ci-contre). Nous sélectionnons
alors le fichier formulaire.html.
Si nous soumettons le formulaire, la connexion échoue, car nous
n’avons pas encore lancé notre serveur de développement écoutant
sur le port 8888.
La console du terminal détaille le code erreur envoyé :
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
127.0.0.1 - - [05/Mar/2021 17:17:43] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [05/Mar/2021 17:17:45] code 404, message File not found
127.0.0.1 - - [05/Mar/2021 17:17:45] "GET /favicon.ico HTTP/1.1" 404 -
127.0.0.1 - - [05/Mar/2021 17:20:35] "GET /formulaire.html HTTP/1.1" 200 -
Nous arrêtons le serveur à l’aide de la combinaison de touches « Ctrl + C », puis nous exécutons le script
server.py qui produit le même effet :
./server.py
1.2. Propulser du code Python
Nous ouvrons alors un nouvel onglet dans le terminal virtuel (à l’aide d’un menu Fichier ou du raccourci
clavier « Ctrl + Maj + T »). Nous plaçons maintenant dans le dossier cgi de notre projet :
cd ../cgi
Et nous exécutons le script server.py de la façon suivante :
./server.py
Le résultat suivant s’affiche alors en console :
Serveur actif sur le port : 8888
Notre second serveur écoute sur le port 8888. Si nous ouvrons
l’adresse localhost:8888 dans le navigateur Firefox, nous
obtenons une erreur. Ce serveur ne peut gérer que les scripts
python CGI. En effet, si nous observons le code (voir la figure ci-
BTS SIO – Cité Scolaire Albert Londres CC-by-sa – moulinux Page 1 / 5
SI : Développement Web en Python (suite)
contre), nous constatons que la variable handler ne traite que les requêtes CGI.
Par contre notre serveur, peut désormais propulser tous les scripts python CGI placés dans le même
dossier et donc notamment le script traite_form_3_1.py, par ailleurs déjà configuré avec des droits
d’exécution.
Si nous soumettons de nouveau le formulaire précédent, les données sont alors traitées, comme en
témoigne d’ailleurs le résultat dans la console de notre serveur CGI :
127.0.0.1 - - [05/Mar/2021 17:40:26] "POST /traite_form_3_1.py HTTP/1.1" 200 -
Le script traite_form_3_1.py est rigoureusement identique à la version utilisée dans le TP précédent.
Nous constatons alors que notre environnement de développement est prêt !
2. Environnement de production
Nous allons maintenant voir comment déployer des applications Web CGI dans un environnement de
production, autre qu’un serveur Web autogéré, qui serait un peu identique à l’environnement de test que
vous trouvez sur les stations de travail de la salle A-207.
Pour cela, nous pouvons créer un compte chez l’hébergeur Always Data, qui est un hébergeur français (et
donc vos données restent en Europe), supportant le langage Python et proposant même un hébergement
gratuit n’excédant pas les 100 Mo.
2.1. Configuration
a) Site
Le site, créé par défaut, est configuré pour PHP. Il existe de nombreuses autres configurations possibles,
que nous pouvons configurer pour le site par défaut via le bouton modifier . Parmi elles, nous
choisissons la configuration « Fichiers statiques »1. Nous devrons ensuite définir un fichier .htaccess
dans le dossier www, afin de reproduire les directives suivantes :
AddHandler cgi-script .py
Options +ExecCGI
b) Accès distant
Un accès distant, notamment en FTP, est configuré par défaut, a priori avec le même défaut que pour
l’accès Web. Il est plus prudent de définir un nouveau mot de passe.
Un accès SSH est également disponible. Par défaut, la connexion par mot de passe n’est pas autorisée.
Une fois que nous avons pris soin de personnaliser un mot de passe robuste, nous pouvons autoriser
l’accès par mot de passe.
2.2. Accéder au système de fichiers distant
L’accès SSH nous permet d’avoir une console sur le serveur distant :
ssh
[email protected]Password:
Cet accès nous permet également d’utiliser le protocole SFTP pour accéder au système de fichiers avec
FileZilla, mais également n’importe quel navigateur de fichiers GNU/Linux comme Thunar à l’aide de
l’URL :
sftp://ssh-albert-londres.alwaysdata.net/home/albert-londres
1 https://help.alwaysdata.com/fr/sites/fichiers-statiques/
BTS SIO – Cité Scolaire Albert Londres CC-by-sa – moulinux Page 2 / 5
SI : Développement Web en Python (suite)
Une fenêtre de dialogue propose alors de saisir
les identifiants d’accès. Il est plus prudent de ne
cocher qu’au maximum « Se souvenir du mot de
passe jusqu’à la fin de la session ».
Une fois les fichiers copiés,
nous pouvons configurer les
droits.
Nous pouvons également
configurer ses droits en console :
cd www
chmod u+x demo.py
chmod u+x traite_form_3_1.py
chmod g+x traite_form_3_1.py
2.3. Shebang
Nos scripts peuvent être poussés presque que tels quels. Le shebang doit cependant être modifié :
#!/usr/bin/python
Sur nos systèmes Debian, c’est la version 2 de python qui serait alors appelé. Ce n’est pas le cas dans
l’environnement d’always data (python 3 donc).
2.4. En cas d’erreurs
Si par inadvertance, devez survenir une erreur 500, il est possible d’accéder aux fichiers logs, qui sont
stockés dans le $HOME/admin/logs/apache.
Avec un accès console, nous pouvons notamment utiliser la commande tail :
tail -n 20 $HOME/admin/logs/apache/apache.log
2.5. Base de données
L’hébergeur Always data propose également l’utilisation de base de
données (toujours dans la limite des 100 Mo pour un compte
gratuit).
Nous choisissons de créer une base de données PostgreSQL pour
une application de démonstration centrée sur la gestion d’étudiants.
Un utilisateur est automatiquement créé. Nous commençons donc
par personnaliser son mot de passe (en prenant bien soin d’en créer
un nouveau surtout que dans un premier temps, il sera stocké en clair
dans le système de fichiers de l’hébergeur).
La base de données peut alors être administré via l’interface Web un
peu austère de PhpPgAdmin. Nous utilisons le client psql en ligne de commandes :
psql -h postgresql-albert-londres.alwaysdata.net -U albert-londres -W -d albert-
londres_etudiants
Nous pouvons alors exécuter le code de création des tables et du jeu d’essai.
L’environnement standard de Python n’est pas suffisant pour que notre application puisse s’exécuter. Il est
donc nécessaire, conformément à la documentation, d’installer quelques paquets supplémentaires à l’aide
des dépôts de PyPI. Nous ouvrons pour cela, une console sur le système de l’hébergeur :
ssh [email protected]
BTS SIO – Cité Scolaire Albert Londres CC-by-sa – moulinux Page 3 / 5
SI : Développement Web en Python (suite)
Puis, nous exécutons les deux commandes pip suivantes :
pip install psycopg2
pip install Jinja2
En effet, le script utilise le moteur de templates Jinja2 afin d’améliorer l’organisation
du code. Le fichier template a été déposé dans un sous-dossier, car potentiellement il
sera rejoint pas d’autres gabarits dans une itération suivante. Le reste de l’application
suit les bonnes pratiques d’organisation modulaires, où chaque module traite une
couche logique de l’application (passerelle vers la base de données, module principal,
dictionnaire de langue, module de configuration).
Après avoir modifié le shebang de notre application, nous pouvons alors exécuter
notre application en ouvrant l’adresse albert-londres.alwaysdata.net/cgi_etudiants/app.py dans
Firefox.
Remarque : Nous n’avons pas utilisé d’environnement virtuel afin de simplifier la procédure. Ce
ci sera néanmoins indispensable à partir du moment où nous souhaitons héberger plusieurs
applications.
2.6. Certificat SSL
Pour le moment, nous n’avons pas
mobilisé de données personnelles.
Mais cette situation n’est pas réaliste.
L’hébergeur Always Data permet
d’intégrer des certificats SSL ou
d’auto-générer des certificats Let’s
encrypt.
Pour cela, nous nous rendons dans le
menu « avancé » de l’interface
d’administration, puis nous sélectionnons l’option « Certificats SSL ». Un bouton permet d’ajouter un
certificat SSL. Nous choisissons alors le type de certificat dans une liste déroulante (voir la figure ci-
dessus). Il ne nous reste plus qu’à préciser l’adresse de notre site.
2.7. Définition de l’index d’un dossier
Si nous souhaitons que notre application soit directement accessible à l’adresse albert-
londres.alwaysdata.net/cgi_etudiants, nous pouvons définir la directive DirectoryIndex dans un
nouveau fichier .htaccess dans le sous-dossier cgi_etudiants :
AddHandler cgi-script .py
Options +ExecCGI
DirectoryIndex app.py
BTS SIO – Cité Scolaire Albert Londres CC-by-sa – moulinux Page 4 / 5
SI : Développement Web en Python (suite)
3. ANNEXE
3.1. Configuration apache personnalisée
Le site, créé par défaut, est configuré pour PHP. Il existe de nombreuses autres configurations possibles,
que nous pouvons configurer pour le site par défaut via le bouton modifier . Parmi elles, nous
choisissons la configuration « Apache personnalisée »2, le système nous impose alors de configurer les
directives du « virtual host ». Il nous faut, a minimum, configurer la directive DocumentRoot. Nous en
profitons au passage pour autoriser l’exécution de script Python CGI dans un sous-dossier cgi-bin de
notre espace Web :
DocumentRoot "/home/albert-londres/www"
<Directory /home/albert-londres/www/cgi-bin/>
Options ExecCGI
SetHandler cgi-script
</Directory>
Nous aurions pu également ne définir que la directive DocumentRoot, mais nous aurions dû alors définir
un fichier .htaccess dans le dossier www, afin de reproduire des directives équivalentes :
AddHandler cgi-script .py
Options +ExecCGI
3.2. Accès FTP
Nous pouvons par exemple utiliser le client FTP
Filezilla. Le menu « Fichier » nous permet d’accéder
au « Gestionnaire de sites ». Nous ajoutons alors un
« Nouveau site ». L’hôte est ftp-albert-
londres.alwaysdata.net, l’identifiant albert-londres
(voir la figure ci-contre).
Une fois nos fichiers poussés sur le serveur (voir la
figure ci-dessous), nous n’oublions pas de configurer
des droits d’exécution (utilisateur et groupe) sur nos
scripts Python (voir la figure ci-dessous).
2 https://help.alwaysdata.com/fr/sites/apache-personnalis%C3%A9/
BTS SIO – Cité Scolaire Albert Londres CC-by-sa – moulinux Page 5 / 5