Vous êtes sur la page 1sur 7

Programmation python web avec apache2/CGI

Prof. Samuel OUYA

Introduction

CGI (Common Gateway Interface) définit une méthode d'interaction entre un serveur web et des
programmes générateurs de contenu externes, plus souvent appelés programmes CGI ou scripts
CGI. Il s'agit d'une méthode simple pour ajouter du contenu dynamique à votre site web en utilisant
votre langage de programmation préféré.
Dans ce cours, nous allons montrer comment faire pour :
1- activer le module cgid d’apache2 pour la prise en compte des scripts
2- écrire un script cgi en python
3- appeler un script cgi à travers un formulaire html
4- recuperer des paramètres reçus par un script cgi python

A- Préparation de l’environnement de travail

Nous allons installer les paquets suivants :


1- python3
2- python3-mysqldb : pour que les programmes python puissent manipuler une base de données
mysql

B- Vérification du chemin autorisé des scripts

On suppose que vous avez déjà installé apache2

On édite le fichier /etc/apache2/conf-available/serve-cgi-bin.conf

pour remarquer le dossier des scripts cgi est /usr/lib/cgi-bin

fig : pour le chemin des scripts cgi

C- Méthodologie de conception d’un script cgi


C1- on cree un fichier .py dans le dossier //usr/lib/cgi-bin
contenant le script cgi
C2- on rend ce script exécutable par commande

chmod a+x //usr/lib/cgi-bin/nomscript.py

C3- pour appeler le script cgi, dans un navigateur

http://localhost/cgi-bin/nomscript.py

D- Structure d’un script cgi en python

#!/usr/bin/python3
print('Content-Type: text/plain')
print('')
print('Ceci est un test de CGI 12 !')

explication :
On commence par preciser l’interpreteur python
#!/usr/bin/python3

Puis on definit le type de données pour que le client puisse interpreter


print('Content-Type: text/plain')

Puis on crée une ligne vide entre l’entête et le corps des messages HTTP
print('')

On teste notre premier cgi test.py

fig : test du script test.py


E- Méthodologie à suivre pour écrire un programme en python manipulant une
base de données mysql

E1- Il faut avoir installé un connecteur python pour mysql

En effet, il y a plusieurs connecteurs mysql dont on peut citer : mysql.connector , pymysql et


python3-mysqldb

Nous allons utiliser dans ce cours python3-mysqldb

E2- on importe le module python chargeant le connecteur de mysql

dans notre cas, après la première ligne qui est indique l’interpréteur python, on ajoute la ligne :

import MysQLdb

E3- on prépare la requête sql dans une variable

Si la requête sql doit comporter des variables ou paramètres d’une fonction , on remplace chaque
variable par %s

Ensuite, on crée une variable tuple ( vecteur avec une ou plusieurs composantes) contenant
les variables ou paramètres

E4- On se connecte à la base de données en utilisant un utilisateur qui a des droits, tout le
paramètre conn de connexion au serveur de BD et le curseur qui nous permettra exécuter plus
tard des requêtes

Par exemple

conn= MySQLdb.connect(user='bouki2', passwd='P@sser123', db='banque')

curseur= conn.cursor()

Dans cet exemple, on n’a pas précisé le paramètre host=’ipserveurBD’ car la base de données est
locale

le compte crée sur le SGBD qui les droits sur notre base banque est bouki2 avec le mot de passe
P@sser123

E5- On exécute la requête

Si la requête contient des variables ou paramètres, on crée la variable tuple val=(para1,para2,


…,paran)
et on utilise le curseur pour exécuter la requête comme suit :

curseur.execute(req,val)
mais
si la requete contient une seule variable ou paramètre val doit quand même avoir virgule comme
suit :

val=(para,)

si la requête ne contient pas parametre alors execute ne prendra pas le deuxieme parametre
comme suit :

curseur.execute(req)

Attention, si la requete doit modifier la base, on doit apres l’execution de la requete, valider
les modifications par la commande conn.commit()

E6- Au cas où la requête retourne des résultats qu’on voudrait exploiter, on peut la méthode

fetchall() qui mettra les résultats de la requête dans un tableau qu’on pourrait parcourir par
la boucle :

for row in curseur.fetchall() :


action

Ecrivons un deuxieme script d’affichage

#!/usr/bin/python3
import MySQLdb
print("Content-Type: text/html")
print()
print("<html><head><title>Comptes</title></head>")
print("<body>")
connection = MySQLdb.connect(user='bouki2', passwd='P@sser123', db='banque')
cursor = connection.cursor()
cursor.execute("SELECT * from clients")
print('<table border="1px">')
print("<tr><td>Prenom</td><td>Nom</td><td>Numcompte</td><td>Code</td><td>Solde</
td></tr>")
for row in cursor.fetchall():
print("<tr><td>%s </td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>" %
(row[1],row[2],row[3],row[4],row[5]))
print ("</table>")
print ("</body></html>")
connection.close()
Test dans un navigateur

fig : Affiche info depuis une base de données

F- Méthodologie à suivre pour recuperer les données d’un formulaire dans un script cgi

F1- On importe les modules de gestion de cgi et de des formulaires cgi,cgitb

import cgi, cgitb

F1- on recupere le formulaire dans une variable puis on extrait la valeur de chaque champ

par exemple

form = cgi.FieldStorage()
prenom = form.getvalue('prenom')
nom = form.getvalue('nom')
numcompte = form.getvalue('numcompte')
code = form.getvalue('code')
montant = form.getvalue('montant')

Écrivons un script recuperant des parametres depuis un formulaire

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
import cgi, cgitb
import MySQLdb
def database():
global conn,cursor
conn=MySQLdb.connect(user='bouki2', passwd='P@sser123', db='banque')
cursor=conn.cursor()

def inserer(prenom,nom,numcompte,code,montant):
sql="insert into clients (prenom, nom,numcompte,code,montant) values (%s, %s, %s, %s,%s)"
database()
val = (prenom,nom,numcompte,code,montant)
cursor.execute(sql,val)
conn.commit()

print("Content-Type: text/html")
print()
print("<html><head><title>Comptes</title></head>")
print("<body>")

orm = cgi.FieldStorage()
prenom = form.getvalue('prenom')
nom = form.getvalue('nom')
numcompte = form.getvalue('numcompte')
code = form.getvalue('code')
montant = form.getvalue('montant')

inserer(prenom,nom,numcompte,code,montant)
print("Insertion reussie")
print("</body>")
print("</html>")

G- Envoi des données d’un formulaire html à un script cgi python

Exemple

!doctype html>
<html>
<head>
<title>demo cgi</title>
</head>
<body>
<form name="pyform" method="POST" action="/cgi-bin/crud.py">
Prenom: <input type="text" name="prenom" /><br>
Nom: <input type="text" name="nom" /><br>
Numcompte: <input type="text" name="numcompte" /><br>
Code: <input type="text" name="code" /><br>
Solde:<input type="text" name="montant" /><br>
<input type="submit" name="Submit" value="Valider" />
</form>
</body>
</html>

Conclusion partielle
Python est un langage très simple.
En programmation la rigueur dans la démarche est très importante pour gagner du temps

Vous aimerez peut-être aussi