Accueil

Traduction

Tutoriel Python - sommaire

Tutoriel Python - recherche

L'auteur : Patrick Darcheville

Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site

Python et le web

Remarquez que durant 19 chapitres je n'ai jamais employé le terme "Web". N'en concluez pas qu'il est impossible de développer des sites web et des applications web avec le langage Python.
Vous allez voir dans ce chapitre que l'on peut utiliser Python comme langage côté serveur.

Vous savez que pour avoir des pages web dynamiques on ne peut pas se contenter de HTML & CSS.
Pour que les documents HTML puissent être mis à jour automatiquement il faut qu'il soient reliés à une base de données via l'emploi d'un langage côté serveur.
Dans un autre tutoriel de mon site (tuto intitulé "débuter en programmation web") j'ai proposé la solution historique : emploi de PHP et de mySQL (SGBD relationnel). Et bien sachez que vous pouvez également utiliser Python à la place de PHP, SQLite à la place de mySQL.

Technologie CGI

CGI est l'acroynme de Common Gateway Interface.
Cette technologie est désormais dépassée et nous verrons pourquoi. Désormais tout développement web important en Python passe par un framework tel Django ou Flask.

Un serveur HTTP en Python

Pour qu'un programme Python puisse être appelé à partir d'un navigateur il faut créer un serveur web.

À la racine de C: je crée un nouveau dossier que je nomme "python_web". Puis je produis dans ce nouveau répertoire un fichier nommé "serveur.py" (donc un script python).
Ci-dessous le code du fichier "serveur.py" :

Une page statique écrite en python : "menu.py"

Le script "menu.py" (toujours dans le répertoire c:\python_web)

Il faut importer le module cgi.
En python il est possible de créer une chaine multilignes à condition qu'elle soit délimitée par """
C'est que nous faisons pour écrire tout le code CSS & HTML de la page, code qui est contenu dans la variable code_html.
Pour que ce code CSS & HTML soit généré par le serveur HTTP doit être l'argument de la fonction print() de Python.

Tests

Il faut lancer le serveur HTTP.
Aspect du terminal windows (CMD ou PowerShell) :

J'ai donc saisi : cd c:\python_web
puis j'ai saisi : python serveur.py (ou py serveur.py)

Alors je peux basculer sur le navigateur et je saisis dans la barre d'URL : localhost:8080/menu.py
La page web s'affiche alors.
La feuille de style interne est prise en compte mais il y a un problème : la lettre E acentué du mot "affiché" apparait sous la forme de ? dans un losange. Il y a donc un problème d'encodage.

Pour lancer le serveur il y a une autre solution encore plus rapide : à partir de l'explorateur de fichiers de windows double-cliquez sur le fichier "serveur.py".

Solution au problème

Faites une copie (toujours dans le dossier "python_web") de "menu.py" et nommez cette copie "menu2.py".

Pour que les chaines de caractères soient bien interprétées en UTF-8 il faut rajouter dans le script une instruction complexe :
sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach() )
Cette instruction fait appel à des objets des modules sys & codecs. Il faut donc importer ces deux modules.

Le code du script "menu2.py" :
Il suffit donc d'insérer les trois instructions suivantes :

Tapez dans la barre d'URL du navigateur : localhost:8080/menu2.py
La page web s'affiche désormais avec toutes les lettres accentuées.

Une page dynamique en python

Je vous propose désormais une page web écrite en python qui sera utilisée par le visiteur pour se connecter à son espace. Il y aura donc un interaction entre le script et le visiteur (qui doit effectuer des saisies).

Le code du script

Dans une première version de ce script l'instruction print("Content-type: text/html; charset=utf-8\n") n'existait pas mais la fenêtre du navigateur restait vide ...
Notez trois instructions en python pur :

form = cgi.FieldStorage()
print(form.getvalue("identifiant"))
print(form.getvalue("motdepasse"))

Grâce à ces instructions nous pouvons manipuler récupérer les valeurs saisies dans les champs de formulaire nommés respectivement "identifiant" et "motdepasse".

Le code HTML relatif au formulaire ne pose aucune difficulté. Notez cependant la valeur de l'attribut action qui vaut #. Ce qui veut dire que les données sont envoyées vers "connexion.py".

Le rendu dans le navigateur

Le serveur HTPP étant toujours ouvert (sur le port 8080), tapez dans la barre d'URL du navigateur :
localhost:8080/connexion.py
Juste aussi du titre de la page, le terme "none" apparait deux fois. C'est normal car vous n'avez pas encore renseigné le formulaire.
Remplissez les deux champs puis cliquez sur le bouton de soumission et observez ... ; les données soumissionnées ont bien été traitées par le script : apparaissent désormais en haut de la fenêtre.

Un script qui manipule une base de données

De même qu'avec PHP vous pouvez manipuler une base de données mySQL. Via Python on peut traiter une base SQLite (ou mySQL).

Travaux préalables

Si vous avez bien suivi tous les chapitres de ce tutoriel, vous disposez d'une base SQLite nommée "animaux.db" dans le dossier c:\python_prog.
Je rappelle que cette base contient deux tables "especes" & "taxons" ; tables reliées entre elles par un champ de jointure nommé "code" dans les deux tables ; "taxons.code" est clé primaire et "especes.code" est clé étrangère.
Copiez cette base dans c:\python_web

Rappels SQLite3

Je rappelle tout d'abord que SQLite est beaucoup plus simple à mettre en oeuvre que les autres SGBD : pas besoin d'installer un serveur sur votre ordinateur.
Par ailleurs une base de données se traduit par un seul fichier.
Dans les chapitres 17 et 18 de ce tuto j'ai évoqué la manipulation d'une base de données SQLite avec l'interface DB browser puis via des programmes python.

Le script "especes_liste.py"

Dans le même dossier créez un nouveau fichier nommé "especes_liste.py".

Ci-dessous le code de "especes_liste.py".

Il faut toujours gérer l'encodage UTF-8 de la même façon.
Les données produites par la requête sélection étant affichées dans un tableau, il faut styler ce dernier d'où deux règles de style.
Il faut se connecter à la base, le problème du chemin étant résolu (script et base dans le même répertoire). Mais n'oubliez pas d'importer le module sqlite3.
Il faut exécuter une requête sélection sur la table "especes".
Il faut créer une boucle pour afficher toutes les données dans des lignes (TR) et cellules(TD) du tableau.
L'instruction connexion.row_factory =sqlite3.Row permet de manipuler les noms des champs des champs (et non pas leur indice).
Notez bien l'instruction de boucle :

 for ligne in lignes:
    print('' +ligne['nom_espece'] + '' + ligne['code'] + '')

Le rendu

Le serveur web étant toujours ouvert, tapez dans la barre d'URL : localhost:8080/especes_liste.py

Le rendu est esthétique : un titre général et un tableau avec toutes les espèces classées par code.

Remarque

Pour afficher le code HTML généré par ce script Python (et en fonction du contenu actuel de la table "especes"), il suffit de sélectionner l'onglet "éléments" de la console du navigateur.

Conclusion

Le programme "especes_liste.py" reposant sur la technologie CGI est une "joyeux" mélange de SQL, de Python et de HTML.
Pour des développements complexes, l'emploi de la technologie CGI aboutirait à des scripts impossibles à maintenir car très difficiles à comprendre du fait du mélange de langages.

Nous allons donc passer dans les chapitres qui suivent à une autre technologie : l'emploi d'un framework Python et plus précisément le plus populaire : Flask.

Récupérer le dossier "python_web"

Version compressée du dossier sous forme d'un zip