Facebook Twitter Google + Flickr Netvibes Flux RSS

Script Python CGI sur hébergement OVH

Langage PythonNous allons voir ici comment afficher le fameux "Hello world !" sous forme d'un script CGI écrit en Python pour un site web hébergé chez OVH.

Pré-requis :

  • Vous avez un nom de domaine «monsite.com» souscrit auprès de OVH
  • Un client FTP pour transférer le fichier sur votre hébergement.

Vous diposez donc d'un accès FTP chez OVH pour déposer les fichiers qui constituent votre site web sur le serveur. Vous pouvez vous y connecter via FileZilla et vous rester à la racine de votre espace. A noter que les fichiers constituant votre site web proprement dit sont dans le dossier www. A la racine, vous trouverez un dossier nommé cgi-bin. Vous pourrez alors déposer dans ce dossier un fichier que nous appellerons hello_world.py qui contiendra ces lignes :

#!/usr/bin/python
print "Content-type: text/html\n\n"
print "<h1>Hello World !</h1>"

Attention, quand vous créez ce script, vous devez utiliser un éditeur qui ne va pas vous coller des codes de mise en page partout comme Word avec un .doc. J'utilise maintenant Gedit, qui propose un affichage spécifique à de nombreux langages informatiques (Php, Python, Html...). Enfin, en enregistrant votre script avec Gedit, vérifier que le codage de caractère est bien en UTF-8.

Code UTF8

Il faut maintenant modifier les droits de ce fichier en faisant : clic droit sur le fichier dans la fenêtre de Filezilla > Droits d'accès au fichier > cocher Lire Ecrire Exécuter pour les lignes Permissions du propriétaire et Lire et Exécuter pour les permissions publiques, ou bien taper 705 dans le champ valeur numérique.

Si vous saississez http://www.monsite.com/cgi-bin/hello_world.py dans votre navigateur, vous devriez voir cela :

Hello World !

 

Quel intérêt de réaliser un script en Python ?

Le recours au script Python peut être intéressant pour traiter des données de formulaires par exemple. Ils permettent de bénéficier des nombreuses bibliothèques dont dispose le langage Python pour réaliser vos applications web. Certains considèrent que le recours à ce genre de script est un gage de sécurité par rapport à du code directement intégré au html comme le Php.

Récupérer une donnée d'un formulaire

Le formulaire html : Pour récupérer dans un script CGI en Python, une donnée saisie dans un formulaire html vous devez avoir tout d'abord créé un formulaire classique avec ce genre de code :

//<html>
<body>
<form action="http://www.monsite.com/cgi-bin/test_form.py" method="post">
Le nom de votre personnage : <input name="perso" type="text" />
<input name="" type="submit" />
</form>
</body>
</html>

A noter que vous pouvez utiliser indifféremment la méthode POST ou GET pour transmettre les données du formulaire html, au script CGI Python. Ici, nous souhaitons que le script CGI Python reconnaisse le nom choisi par l'Internaute pour son personnage et l'affiche. Pour la valeur «action», vous devez bien sûr indiquer le chemin vers le fichier qui va traiter les données saisies : http://www.monsite.com/cgi-bin/test_form.py. Le nom saisi sera transmis par la valeur «name».

Le script Python : il sera placé dans /cgi-bin de votre espace chez OVH, en n'oubliant pas de donner les droits d'exécution à ce script (705). Nous importons la bibliothèque cgi du langage Python par «import cgi», puis, grâce à la fonction «FieldStorage» du module cgi, le script mémorise les valeurs transmises par le formulaire : form = cgi.FieldStorage(). Nous récupérons la valeur «name» avec la méthode «getvalue» : perso = form.getvalue("perso"). Puis, nous l'affichons avec un classique «print».

1. #!/usr/bin/python
2. import cgi
3. form = cgi.FieldStorage()
4. perso=form.getvalue("perso")
5. print "Content-type: text/html\n\n"
6. print "Le nom de votre personnage est : " + perso

 Cela devrait vous donner ceci si vous saisissez «tintin» dans le champ texte :

Récupération de données Script CGI Python

Se connecter à une base de données MySQL

A l'aide d'un script écrit en Python, vous pouvez interagir avec une base de données MySQL. Nous allons voir ci-après le script qui permet de récupérer des données et de les afficher simplement. Dans un premier temps, vous devez appeler les bibliothèques nécessaires au bon fonctionnement du script, celles relatives aux scripts CGI et celle relative à la gestion de la base de données MySQL.

1. #!/usr/bin/python
2. import cgi
3. import cgitb
4. import MySQLdb

Ensuite, vous devez indiquer au script que vous allez afficher du HTML :

5. print "Content-type: text/html\n\n"

Et vous commencez à "printer" votre page HTML :

6. print "<html><head><title>Connexion BDD</title></head><body>\n"

Vient ensuite la connexion à la base données proprement dite. Il faut créer une connexion "conn" et un curseur "cursor" à l'aide des fonctions MySQLdb.connect() et cursor(). C'est à l'aide de ce curseur "virtuel" que vous allez vous déplacer dans les données de la base, les pointer pour les utiliser, ici pour les afficher.

7. conn = MySQLdb.connect(host = "SERVEUR OVH souvent de type Mysqlx-x chez ovh", 
user = "UTILISATEUR, souvent même nom que la base chez ovh",
passwd = "MOT DE PASSE", db = "NOM DE LA BASE")
8. cursor = conn.cursor()

Une fois le curseur défini, il faut lui indiquer la requête SQL à exécuter dans cursor.execute(requête) et récupérer les données dans une variable "data" de type Tuple.

9. cursor.execute("SELECT * FROM table WHERE id=32")
10. data = cursor.fetchone()

Puis, grâce à une boucle While, on affiche toutes les champs (14 champs ici) de l'enregistrement correspondant à id=32 dans votre table.

11. i = 0 
12. while i <= 13:
13.    print "<p>", data[i], "</P>"
14.    i= i + 1
15. print "</body></html>"

Ne pas oublier de fermer votre curseur et la connexion à la base quand les opérations sont finies.

16. cursor.close()
17. conn.close()

Afficher les données d'une BDD MySql

Si vous avez réussi à connecter votre script à une base de données de type MySql comme indiqué ci-dessus, il vous faut maintenant afficher les données comme vous le souhaitez. Pour mieux comprendre comment fonctionne le "curseur", je vous propose de récupérer toutes les données d'une base avec la fonction fetchall() et de choisir d'afficher certains champs de certains enregistrements.

Reprenons les premières lignes du script ci-dessus pour la connexion à la base.

1. #!/usr/bin/python
2. import cgi
3. import cgitb
4. import MySQLdb

5. print "Content-type: text/html\n\n"
6. print "<html><head><title>Connexion BDD</title></head><body>\n"

7. conn = MySQLdb.connect(host = "SERVEUR OVH souvent de type Mysqlx-x chez ovh",
user = "UTILISATEUR, souvent même nom que la base chez ovh",
passwd = "MOT DE PASSE", db = "NOM DE LA BASE")
8. cursor = conn.cursor()

Je récupère toutes les données dans une variable que nous appellerons "data"

9. cursor.execute("SELECT * FROM table")
10. data = cursor.fetchall()

Et je choisis d'afficher le 3e champ des 20 premiers enregistrements :

11. i = 0 
12. while i <= 20:
13.    print "<p>", data[i][3], "</P>"
14.    i= i + 1

15. print "</body></html>"
16. cursor.close()
17. conn.close()

Avec fetchall(), il faut comprendre que les données sont récupérées dans la variable "data" sous forme d'une liste (les enregistrements) de tuple (les champs d'un enregistrement). Et que le curseur de Python va chercher les données en lui indiquant le numéro de l'enregistrement + le numéro du champ. Donc data[2][5] correspondra au 5e champs du 2e enregistrement des données récupérées.

 Format des données récupérées dans MySql

 

ATTENTION, je ne suis pas un développeur professionnel, juste un amateur en auto-formation. Ce que j'écris n'est donc pas parole d'évangile informatique, mais cela fonctionne. Les experts sont les bienvenus pour partager les bonnes pratiques, voire les corrections d'erreurs, via les commentaires de cet article.

 

Share

Commentaires   

 
0 #2 pouye 08-09-2016 03:48
Bonjour, merci pour ce tuto, j'ai testé et ca marche très bien même... Mon seul problème est de savoir si on peut importer des modules externes (les modules dont on importe avec la commande pip...)
Merci d'avance.
Citer
 
 
0 #1 fred 22-11-2015 12:27
Pour ce qui est de la première ligne, ça marche pas tel quel (du moins sur mon mutu).
Par contre :
#!/usr/bin/env python


Fonctionne normalement quel que soit l’emplacement de l'exécutable.

Dans tous les cas, merci pour le tuto :-)
Citer
 

Ajouter un Commentaire


Code de sécurité
Rafraîchir

SeedingUp | Digital Content Marketing
SeedingUp | Digital Content Marketing

© Lokazionel - Marc Fulconis ¦ Joomla ¦ Template Lokazionel ¦ Crédit ¦ A propos ¦ Contact ¦ Publicité