Python - Programmation CGI : Guide Ultime pour les Débutants

Bonjour à tous, futurs sorciers Python ! Je suis ravi d'être votre guide dans cette passionnante aventure dans le monde de la programmation CGI avec Python. En tant que personne qui enseigne la science informatique depuis des années, je peux vous dire que le CGI est comme la sauce secrète qui fait que vos applications web prennent vie. Alors, mettons-nous au travail !

Python - CGI Programming

Qu'est-ce que le CGI ?

CGI signifie Common Gateway Interface. Je sais que cela en fait un nom à faire saillir, mais imaginez-le comme un traducteur entre votre serveur web et vos scripts Python. C'est comme avoir un interprète amical qui aide votre serveur et votre code à communiquer sans accroc.

Le CGI permet de créer des pages web dynamiques qui peuvent répondre à l'entrée de l'utilisateur. Imaginez un site web qui vous salue par votre nom ou vous affiche un contenu personnalisé - c'est la magie du CGI en action !

Navigation sur le Web

Avant d'aller dans les détails du CGI, jettons un coup d'œil rapide à comment fonctionne la navigation sur le web. Lorsque vous tapez une URL dans votre navigateur, voici ce qui se passe :

  1. Votre navigateur envoie une requête au serveur web.
  2. Le serveur web traite la requête.
  3. Le serveur envoie une réponse, généralement sous la forme d'une page HTML.
  4. Votre navigateur affiche cette page HTML, affichant la page web que vous voyez.

Le CGI entre en jeu lorsque nous voulons générer du contenu dynamique à l'étape 3.

Diagramme de l'Architecture CGI

Voici un diagramme simple pour visualiser comment le CGI s'intègre dans l'architecture web :

+-------------+    Requête HTTP    +-------------+
|   Navigateur   | -----------------> |  Serveur Web |
|               | <----------------- |             |
+-------------+    Réponse HTTP     +-------------+
                                          |
                                          | CGI
                                          v
                                   +-------------+
                                   | Script CGI  |
                                   | (Python)    |
                                   +-------------+

Support et Configuration du Serveur Web

La plupart des serveurs web supportent le CGI, y compris Apache et Nginx. Pour utiliser le CGI avec Python, vous devez configurer votre serveur pour exécuter des scripts Python. Cela implique généralement de créer un répertoire spécial pour les scripts CGI et d'indiquer au serveur de traiter les fichiers de ce répertoire comme des exécutables.

Par exemple, dans Apache, vous pourriez ajouter quelque chose comme ceci à votre configuration :

<Directory /var/www/cgi-bin>
    Options ExecCGI
    AddHandler cgi-script .py
</Directory>

Cela indique à Apache d'exécuter les fichiers .py dans le répertoire /var/www/cgi-bin comme des scripts CGI.

Premier Programme CGI

Écrivons notre premier programme CGI ! Commençons par l'exemple classique "Hello, World!". Créez un fichier nommé hello.py dans votre répertoire CGI :

#!/usr/bin/env python3
print("Content-Type: text/html")
print()
print("<html>")
print("<head>")
print("<title>Hello World - Premier Programme CGI</title>")
print("</head>")
print("<body>")
print("<h2>Hello World ! C'est mon premier programme CGI</h2>")
print("</body>")
print("</html>")

Analysons cela :

  1. La première ligne indique au serveur d'utiliser Python pour exécuter ce script.
  2. Content-Type: text/html est un en-tête HTTP qui indique au navigateur que nous envoyons du HTML.
  3. L'appel空白 print() sépare les en-têtes du corps de la réponse.
  4. Le reste est simplement du HTML que nous générons dynamiquement.

Lorsque vous accédez à ce script via votre navigateur web, vous devriez voir une page qui dit "Hello World ! C'est mon premier programme CGI".

En-tête HTTP

Dans la programmation CGI, il est crucial d'envoyer les en-têtes HTTP corrects avant votre contenu. L'en-tête le plus commun est Content-Type, qui indique au navigateur le type de données que vous envoyez. Voici quelques exemples :

Type de Contenu Description
text/html Contenu HTML
text/plain Texte brut
image/jpeg Image JPEG
application/json Données JSON

Toujours souvenez-vous d'envoyer l'en-tête Content-Type approprié avant votre contenu !

Variables d'Environnement CGI

Les scripts CGI ont accès à diverses variables d'environnement qui fournissent des informations sur la requête. Voici un script qui affiche quelques-unes de ces variables :

#!/usr/bin/env python3
import os

print("Content-Type: text/html")
print()
print("<html><body>")
print("<h2>Variables d'environnement :</h2>")
for param in os.environ.keys():
    print("<b>%20s</b>: %s<br>" % (param, os.environ[param]))
print("</body></html>")

Ce script vous montrera toutes les variables d'environnement disponibles pour votre script CGI, y compris le type de navigateur de l'utilisateur, le nom du serveur, et plus encore.

Méthodes GET et POST

Il y a deux principales méthodes pour envoyer des données à un script CGI : GET et POST. Examinons-les :

Méthode GET

La méthode GET envoie des données en tant que partie de l'URL. Voici un exemple simple :

#!/usr/bin/env python3
import cgi

print("Content-Type: text/html")
print()

form = cgi.FieldStorage()
name = form.getvalue('name', 'Monde')

print("<html><body>")
print(f"<h2>Hello, {name} !</h2>")
print("</body></html>")

Vous pouvez accéder à ce script avec une URL comme http://votreserveur.com/cgi-bin/hello.py?name=Alice, et il dira "Hello, Alice !".

Méthode POST

La méthode POST envoie des données dans le corps de la requête HTTP. Elle est généralement utilisée pour les formulaires. Voici un exemple :

#!/usr/bin/env python3
import cgi

print("Content-Type: text/html")
print()

form = cgi.FieldStorage()
name = form.getvalue('name', 'Monde')
email = form.getvalue('email', 'Non fourni')

print("<html><body>")
print(f"<h2>Hello, {name} !</h2>")
print(f"<p>Votre email est : {email}</p>")
print("</body></html>")

Ce script pourrait être utilisé avec un formulaire HTML qui utilise la méthode POST.

Gestion des Différents Éléments de Formulaire

Le CGI peut gérer divers éléments de formulaire. Examinons quelques exemples :

Cases à Cocher

#!/usr/bin/env python3
import cgi

print("Content-Type: text/html")
print()

form = cgi.FieldStorage()
hobbies = form.getlist('hobby')

print("<html><body>")
print("<h2>Vos hobbies :</h2>")
for hobby in hobbies:
    print(f"<p>{hobby}</p>")
print("</body></html>")

Boutons Radio

#!/usr/bin/env python3
import cgi

print("Content-Type: text/html")
print()

form = cgi.FieldStorage()
gender = form.getvalue('gender', 'Non spécifié')

print("<html><body>")
print(f"<h2>Votre sexe : {gender}</h2>")
print("</body></html>")

Zone de Texte

#!/usr/bin/env python3
import cgi

print("Content-Type: text/html")
print()

form = cgi.FieldStorage()
message = form.getvalue('message', 'Aucun message fourni')

print("<html><body>")
print("<h2>Votre message :</h2>")
print(f"<p>{message}</p>")
print("</body></html>")

Menu Déroulant

#!/usr/bin/env python3
import cgi

print("Content-Type: text/html")
print()

form = cgi.FieldStorage()
country = form.getvalue('country', 'Non sélectionné')

print("<html><body>")
print(f"<h2>Votre pays : {country}</h2>")
print("</body></html>")

Utilisation de Cookies dans le CGI

Les cookies sont un moyen de stocker de petits morceaux de données côté client. Ils sont utiles pour se souvenir des préférences de l'utilisateur ou de maintenir des informations de session. Voici comment vous pouvez travailler avec les cookies dans le CGI :

Définition de Cookies

#!/usr/bin/env python3
import cgi
from http import cookies
import datetime

# Créer un cookie
c = cookies.SimpleCookie()
c['lastvisit'] = str(datetime.datetime.now())
c['lastvisit']['expires'] = 365 * 24 * 60 * 60  # Expire dans un an

print(c)  # Cela imprime l'en-tête Set-Cookie
print("Content-Type: text/html")
print()

print("<html><body>")
print("<h2>Cookie défini !</h2>")
print("</body></html>")

Récupération de Cookies

#!/usr/bin/env python3
import os
from http import cookies

print("Content-Type: text/html")
print()

if 'HTTP_COOKIE' in os.environ:
    cookie_string = os.environ.get('HTTP_COOKIE')
    c = cookies.SimpleCookie()
    c.load(cookie_string)
    lastvisit = c.get('lastvisit')
    if lastvisit:
        print(f"<h2>Votre dernière visite était : {lastvisit.value}</h2>")
    else:
        print("<h2>C'est votre première visite !</h2>")
else:
    print("<h2>C'est votre première visite !</h2>")

Exemple de Téléchargement de Fichier

Gérer les téléchargements de fichiers est un peu plus complexe, mais voici un exemple simple :

#!/usr/bin/env python3
import cgi, os
import cgitb; cgitb.enable()

print("Content-Type: text/html")
print()

form = cgi.FieldStorage()

# Obtenir le nom du fichier ici.
fileitem = form['filename']

# Test si le fichier a été téléchargé
if fileitem.filename:
   # Écarter le chemin d'accès en amont du nom de fichier pour éviter 
   # les attaques de traversal de répertoire
   fn = os.path.basename(fileitem.filename)
   open('/tmp/' + fn, 'wb').write(fileitem.file.read())
   message = f'Le fichier "{fn}" a été téléchargé avec succès'
else:
   message = 'Aucun fichier n'a été téléchargé'

print("""\
<html>
<body>
   <p>%s</p>
</body>
</html>
""" % message)

Comment Déclencher une Boîte de Dialogue de "Téléchargement de Fichier" ?

Pour déclencher un téléchargement, vous devez définir les en-têtes appropriés :

#!/usr/bin/env python3
import os

filename = "example.txt"  # Ce serait le nom de votre fichier
filepath = "/chemin/vers/votre/fichier"  # Ce serait le chemin vers votre fichier

print("Content-Type: application/octet-stream")
print(f"Content-Disposition: attachment; filename={filename}")
print()  # Ligne vide, fin des en-têtes

# Maintenant, envoyez le contenu du fichier
with open(os.path.join(filepath, filename), 'rb') as f:
    print(f.read())

Ce script définit le Content-Type à application/octet-stream, ce qui indique au navigateur de télécharger le fichier plutôt que de l'afficher. L'en-tête Content-Disposition suggère un nom de fichier pour le téléchargement.

Et voilà, mes amis ! Nous avons couvert les bases de la programmation CGI avec Python. Souvenez-vous, la pratique fait l'homme parfait, alors n'hésitez pas à expérimenter avec ces exemples et à créer les vôtres. Bon codage, et que vos scripts CGI fonctionnent toujours sans accroc !

Credits: Image by storyset