[python sur hébérgement mutualisé ovh ] [programmation objet avec Python] [des liens utiles sur python]

Configuration et utilisation de Python sur hébérgement mutualisé OVH

Fabrice de Caluwe

Cette page a pour but de vous permettre de découvrir Python en tant que langage pour le web et en plus en français. L'idée est de pouvoir vous donner des repères pour démarrer rapidement.
Cette page n'a pas la prétention de couvrir tous les thèmes ni même de rentrer dans détails. Ce n'est pas un traité et il ne s'agit pas de faire de la doctrine. L'idée est de faire simple et efficace et partager ma passion pour un langage formidable.

Configuration connue au 4 août 2010 sur cluster 002

Version: Python 2.4.4

Voici les modules disponibles pour vos programmes (411 modules)
  • BaseHTTPServer
  • Bastion
  • CGIHTTPServer
  • ConfigParser
  • Cookie
  • DocXMLRPCServer
  • HTMLParser
  • MimeWriter
  • MySQLdb.connections
  • MySQLdb.constants.CLIENT
  • MySQLdb.constants.CR
  • MySQLdb.constants.ER
  • MySQLdb.constants.FLAG
  • MySQLdb.constants.REFRESH
  • MySQLdb.converters
  • MySQLdb.cursors
  • MySQLdb.release
  • MySQLdb.times
  • PIL.ArgImagePlugin
  • PIL.BdfFontFile
  • PIL.BmpImagePlugin
  • PIL.BufrStubImagePlugin
  • PIL.ContainerIO
  • PIL.CurImagePlugin
  • PIL.DcxImagePlugin
  • PIL.EpsImagePlugin
  • PIL.ExifTags
  • PIL.FitsStubImagePlugin
  • PIL.FliImagePlugin
  • PIL.FontFile
  • PIL.FpxImagePlugin
  • PIL.GbrImagePlugin
  • PIL.GdImageFile
  • PIL.GifImagePlugin
  • PIL.GimpGradientFile
  • PIL.GimpPaletteFile
  • PIL.GribStubImagePlugin
  • PIL.Hdf5StubImagePlugin
  • PIL.IcnsImagePlugin
  • PIL.IcoImagePlugin
  • PIL.ImImagePlugin
  • PIL.Image
  • PIL.ImageChops
  • PIL.ImageColor
  • PIL.ImageDraw
  • PIL.ImageEnhance
  • PIL.ImageFile
  • PIL.ImageFileIO
  • PIL.ImageFilter
  • PIL.ImageFont
  • PIL.ImageGL
  • PIL.ImageGrab
  • PIL.ImageOps
  • PIL.ImagePalette
  • PIL.ImagePath
  • PIL.ImageSequence
  • PIL.ImageStat
  • PIL.ImageTransform
  • PIL.ImageWin
  • PIL.ImtImagePlugin
  • PIL.IptcImagePlugin
  • PIL.JpegImagePlugin
  • PIL.McIdasImagePlugin
  • PIL.MicImagePlugin
  • PIL.MpegImagePlugin
  • PIL.MspImagePlugin
  • PIL.OleFileIO
  • PIL.PSDraw
  • PIL.PaletteFile
  • PIL.PalmImagePlugin
  • PIL.PcdImagePlugin
  • PIL.PcfFontFile
  • PIL.PcxImagePlugin
  • PIL.PdfImagePlugin
  • PIL.PixarImagePlugin
  • PIL.PngImagePlugin
  • PIL.PpmImagePlugin
  • PIL.PsdImagePlugin
  • PIL.SgiImagePlugin
  • PIL.SpiderImagePlugin
  • PIL.SunImagePlugin
  • PIL.TarIO
  • PIL.TgaImagePlugin
  • PIL.TiffImagePlugin
  • PIL.TiffTags
  • PIL.WalImageFile
  • PIL.WmfImagePlugin
  • PIL.XVThumbImagePlugin
  • PIL.XbmImagePlugin
  • PIL.XpmImagePlugin
  • Queue
  • SimpleHTTPServer
  • SimpleXMLRPCServer
  • SocketServer
  • StringIO
  • UserDict
  • UserList
  • UserString
  • aifc
  • anydbm
  • asynchat
  • asyncore
  • atexit
  • audiodev
  • base64
  • bdb
  • binhex
  • bisect
  • bsddb.db
  • bsddb.dbobj
  • bsddb.dbrecio
  • bsddb.dbshelve
  • bsddb.dbtables
  • bsddb.dbutils
  • calendar
  • cgi
  • cgitb
  • chunk
  • cmd
  • code
  • codecs
  • codeop
  • colorsys
  • commands
  • compileall
  • compiler.ast
  • compiler.consts
  • compiler.future
  • compiler.misc
  • compiler.pyassem
  • compiler.pycodegen
  • compiler.symbols
  • compiler.syntax
  • compiler.transformer
  • compiler.visitor
  • cookielib
  • copy
  • csv
  • curses.ascii
  • curses.panel
  • curses.textpad
  • curses.wrapper
  • dbhash
  • debconf
  • decimal
  • difflib
  • dircache
  • dis
  • distutils.bcppcompiler
  • distutils.ccompiler
  • distutils.cmd
  • distutils.command.bdist
  • distutils.command.build
  • distutils.command.clean
  • distutils.command.config
  • distutils.command.install
  • distutils.command.register
  • distutils.command.sdist
  • distutils.core
  • distutils.cygwinccompiler
  • distutils.debug
  • distutils.dist
  • distutils.emxccompiler
  • distutils.errors
  • distutils.extension
  • distutils.filelist
  • distutils.log
  • distutils.msvccompiler
  • distutils.mwerkscompiler
  • distutils.spawn
  • distutils.sysconfig
  • distutils.tests.support
  • distutils.unixccompiler
  • distutils.util
  • distutils.version
  • doctest
  • dumbdbm
  • email.Charset
  • email.Encoders
  • email.Errors
  • email.FeedParser
  • email.Generator
  • email.Header
  • email.Iterators
  • email.MIMEAudio
  • email.MIMEBase
  • email.MIMEImage
  • email.MIMEMessage
  • email.MIMEMultipart
  • email.MIMENonMultipart
  • email.MIMEText
  • email.Message
  • email.Parser
  • email.Utils
  • email.base64MIME
  • email.quopriMIME
  • filecmp
  • fileinput
  • fnmatch
  • formatter
  • fpformat
  • ftplib
  • getopt
  • getpass
  • gettext
  • glob
  • gopherlib
  • gzip
  • heapq
  • hmac
  • hotshot.log
  • hotshot.stats
  • hotshot.stones
  • htmlentitydefs
  • htmllib
  • httplib
  • idlelib.AutoExpand
  • idlelib.Bindings
  • idlelib.CallTipWindow
  • idlelib.CallTips
  • idlelib.ClassBrowser
  • idlelib.CodeContext
  • idlelib.ColorDelegator
  • idlelib.Debugger
  • idlelib.Delegator
  • idlelib.EditorWindow
  • idlelib.FileList
  • idlelib.FormatParagraph
  • idlelib.GrepDialog
  • idlelib.IOBinding
  • idlelib.IdleHistory
  • idlelib.MultiStatusBar
  • idlelib.ObjectBrowser
  • idlelib.OutputWindow
  • idlelib.ParenMatch
  • idlelib.PathBrowser
  • idlelib.Percolator
  • idlelib.PyParse
  • idlelib.PyShell
  • idlelib.RemoteDebugger
  • idlelib.RemoteObjectBrowser
  • idlelib.ReplaceDialog
  • idlelib.ScriptBinding
  • idlelib.ScrolledList
  • idlelib.SearchDialog
  • idlelib.SearchDialogBase
  • idlelib.SearchEngine
  • idlelib.StackViewer
  • idlelib.ToolTip
  • idlelib.TreeWidget
  • idlelib.UndoDelegator
  • idlelib.WidgetRedirector
  • idlelib.WindowList
  • idlelib.ZoomHeight
  • idlelib.aboutDialog
  • idlelib.buildapp
  • idlelib.configDialog
  • idlelib.configHandler
  • idlelib.configHelpSourceEdit
  • idlelib.configSectionNameDialog
  • idlelib.dynOptionMenuWidget
  • idlelib.idle
  • idlelib.idlever
  • idlelib.keybindingDialog
  • idlelib.rpc
  • idlelib.run
  • idlelib.tabpage
  • idlelib.testcode
  • idlelib.textView
  • ihooks
  • imaplib
  • imghdr
  • imputil
  • inspect
  • keyword
  • lib-tk.Canvas
  • lib-tk.Dialog
  • lib-tk.FileDialog
  • lib-tk.FixTk
  • lib-tk.ScrolledText
  • lib-tk.SimpleDialog
  • lib-tk.Tix
  • lib-tk.Tkconstants
  • lib-tk.Tkdnd
  • lib-tk.Tkinter
  • lib-tk.tkColorChooser
  • lib-tk.tkCommonDialog
  • lib-tk.tkFileDialog
  • lib-tk.tkFont
  • lib-tk.tkMessageBox
  • lib-tk.tkSimpleDialog
  • lib-tk.turtle
  • linecache
  • locale
  • logging.config
  • logging.handlers
  • macpath
  • macurl2path
  • mailbox
  • mailcap
  • markupbase
  • mhlib
  • mimetools
  • mimetypes
  • mimify
  • modulefinder
  • multifile
  • mutex
  • netrc
  • new
  • nntplib
  • ntpath
  • nturl2path
  • opcode
  • optparse
  • os
  • os2emxpath
  • pdb
  • pickle
  • pickletools
  • pipes
  • pkgutil
  • platform
  • popen2
  • poplib
  • posixfile
  • posixpath
  • pprint
  • pty
  • pyclbr
  • pydoc
  • quopri
  • random
  • re
  • reconvert
  • regsub
  • repr
  • rexec
  • rfc822
  • rlcompleter
  • robotparser
  • sched
  • sets
  • sgmllib
  • shelve
  • shlex
  • shutil
  • site
  • smtpd
  • smtplib
  • snack
  • sndhdr
  • socket
  • sre
  • stat
  • statcache
  • statvfs
  • string
  • stringold
  • stringprep
  • subprocess
  • sunau
  • sunaudio
  • symbol
  • symtable
  • tabnanny
  • tarfile
  • telnetlib
  • tempfile
  • test.pystone
  • test.regrtest
  • textwrap
  • this
  • threading
  • timeit
  • toaiff
  • token
  • tokenize
  • trace
  • traceback
  • tty
  • types
  • tzparse
  • unittest
  • urllib
  • urllib2
  • urlparse
  • user
  • uu
  • warnings
  • wave
  • weakref
  • webbrowser
  • whichdb
  • whrandom
  • xdrlib
  • xml.dom.NodeFilter
  • xml.dom.domreg
  • xml.dom.expatbuilder
  • xml.dom.minicompat
  • xml.dom.minidom
  • xml.dom.pulldom
  • xml.dom.xmlbuilder
  • xml.parsers.expat
  • xml.sax.expatreader
  • xml.sax.handler
  • xml.sax.saxutils
  • xml.sax.xmlreader
  • xmllib
  • xmlrpclib
  • zipfile

Où installer les fichiers python sur votre hébérgement mutualisé

Les fichiers peuvent être installés dans le répértoire www ou dans le répértoire cgi-bin
1- Si les fichiers sont installés dans le cgi-bin, ils peuvent porter l'extension "cgi" ou "py".
2- Si les fichiers sont installés dans le www, ils doivent porter l'extension "cgi".
L'extension "py" ne fonctionnera pas. Pour cel il faut modifier le fichier .htaccess en rajoutant la ligne suivante:

AddHandler cgi-script .py

Premiers test de fonctionnement avec hello world

Editer le fichier ci-dessous et transférez le sur votre hébérgement
#! /usr/bin/python

print "Content-Type: text/html\n\n"

print """
hello world !
"""

Comment éviter les erreurs 500

Voici un petit rappel des consignes à vérifier en cas d'erreur 500
1- Editer le fichier en mode "unix" afin d'éviter les retour de ligne en CR\LF. Certains éditeurs disposent d'une fonction de convertion "dos vers unix"
2- Assurez vous que le fichier soit en chmod 755. Il doit être executable
3- Vérifiez les 2 entêtes obligatoires et surtout vérifiez l'exactitude des caractères, les retours à la ligne et les espaces.
 #! /usr/bin/python
 print "Content-Type: text/html\n\n"
 
4- Si votre fichier python n'est pas interprété c'est que son extension n'est pas reconnu et donc le programme n'est pas traité. (voir plus haut)

Afficher autre chose qu'une erreur 500 avec le module cgitb

Il est possible d'obtenir des informations concernant les erreurs de votre programme à la place de la traditionnelle page d'erreur 500 qui laisse parfois dans le désespoir. il faut, avant toute autre chose et juste après le chapeau appeler le module cgitb comme suit

#! /usr/bin/python
import cgitb
cgitb.enable()

Python et les jeux de caractères

Bien que l'UTF-8 devienne petit à petit un standard, vous pouvez spécifier dans quel jeux de caractères doit travailler Python. Ainsi vous pouvez spécifier de l'ISO-88-59-1 (latin1) grâce à la commande ci-dessous qui doit être placé dès le début du programme sous le chapeau.
La ligne est toujours précédée du caractère #

#! /usr/bin/python
# -*- coding:Latin-1 -*-

#! /usr/bin/python
# -*- coding:Utf-8 -*-

Utiliser votre base de données mysql avec python sur hébérgement mutualisé ovh

Pour utiliser votre base de données mysql pour allez avoir besoin des mêmes paramètres que ceux nécessaires en php. Les fonctions mysql sont celles de l'API mysql pour C. Vous trouverez la liste de ces fonctions en cliquant ici. Pour utiliser mysql, vous devez appeler le module "_mysql".

#! /usr/bin/python

print "Content-Type: text/html\n\n"
import _mysql
db=_mysql.connect("server","login","password","bdd")
db.query("""SELECT * from ma_table""")
r=db.use_result()
print r.fetch_row()

Récupérer les données d'un formulaire avec le module cgi

Pour récupérer les données d'un formulaire, la technique est identique pour une requête http post ou get.
On utilise la méthode FieldStorage() qui ne peut être appelée qu'une seule fois.
Il faut noter qu'un champ de formulaire qui n'est pas renseigné revient à dire que ce champs n'existe pas.
Du coup, une instruction if ... else a été introduite pour bien montrer ce point précis.

"champ_test" est le nom d'un champ input.
exemple simple avec un champ input

#! /usr/bin/python
print "Content-Type: text/html\n\n"
import cgi
formulaire = cgi.FieldStorage()
if formulaire.has_key("champ_test"):
	valeur = formulaire["champ_test"].value
else:
	valeur ="vide"
print(valeur)

La méthode getlist() permet de récupérer une liste de valeur quand plusieurs champs portent le même nom.
La méthode getvalue(clé, valeur_par_défaut) permet de récupérer la valeur transmise.
Le second paramètre est optionnel . Il permet de substituer une valeur par défaut à la valeur transmise.

#! /usr/bin/python
print "Content-Type: text/html\n\n"
import cgi
formulaire = cgi.FieldStorage()
#champ_test est un champ de type input type=text
print(formulaire.getvalue("champ_test"))
#champ_list est un champ de type checkbox
my_list = formulaire.getlist("champ_list")
#my_list est un tableau contenant les valeurs
print my_list
#on peut également afficher les valeur ainsi:
print ",".join(my_list)


    

Le cas des cases à cocher. Si on utilise un champ checkbox utilisant le même nom, seules les cases cochés retourneront leurs valeurs.
Soit un formulaire html avec deux cases à cocher
checkbox = a (on ne coche pas la première)
checkbox = b (on coche la seconde)

Le résultat du traitement donnera uniquement b


La fonction cgi.print_form(cgi.FieldStorage()) permet d'afficher d'un coup toutes les noms de champs d'un formulaire et leurs valeurs respectives.
#! /usr/bin/python
print "Content-Type: text/html\n\n"
import cgi
formulaire = cgi.FieldStorage()
cgi.print_form(formulaire)

Les attributs permettant de récupérer les informations sur un champ de type file sont:
filename et type
La méthode read() permet d'acquérir le contenu du fichier

Exemple de récupération d'un champ file
#! /usr/bin/python
print "Content-Type: text/html\n\n"
import cgi
formulaire = cgi.FieldStorage()
#myfile est le nom du champ
print(formulaire["myfile"]).filename #nom du fichier 
print(formulaire["myfile"].type) #type mime 
print(formulaire["myfile"].file.read())#contenu du fichier

# pour enregistrer le fichier on aurait pu faire ainsi:
fichier = open(formulaire["myfile"], "w+")
fichier.write(formulaire["myfile"].file.read())
fichier.close()

Créer, enregistrer et lire un fichier

Créer, enregistrer, lire un fichier est très simple. La technique rappelle ce qui est utilisé avec php.
Ne pas oubliez de définir éventuellement le charset.
file("fichier","flag") permet d'ouvrir un fichier. flag vous permet d'indiquer le mode d'ouverture (w+,a etc...)
La méthode read() permet de lire le contenu. Si vous ne souhaitez récupérer qu'une partie du texte utilisez read([longueur]).
La méthode readline() permet de lire une seule ligne. Il est possible de limiter le nombre d'octets à lire en utilisant readline([longueur]).
La méthode write() permet d'écrire dans le fichier.
La méthode close() permet de fermer le fichier.
A noter: il existe un module appelé pickle qui permet d'enregistrer des données et de récupérer ensuite
ces mêmes données de manière séparée.

#! /usr/bin/python
# -*- coding:Latin-1 -*-
import cgitb
cgitb.enable()
print "Content-Type: text/html\n\n"
# création / enregistrement d'un fichier
contenu = "test de fichier"
mon_fichier = file("lisezmoi.txt","w+")
mon_fichier.write(contenu)
mon_fichier.close()

#lecture d'un fichier
le_fichier = file("lisezmoi.txt")
contenu = le_fichier.read()
le_fichier.close()
print contenu

Créer et récupérer des cookies

exemple de création simple d'un cookie de session

#! /usr/bin/python
import cgitb,os,Cookie
cgitb.enable()
le_cookie = Cookie.SimpleCookie()
le_cookie['mon_nom'] = "ma_valeur"
print le_cookie
print "Content-Type: text/html\n"

exemple de création d'un cookie avec paramètres

#! /usr/bin/python
import cgitb,os,Cookie
cgitb.enable()
le_cookie = Cookie.SimpleCookie()
le_cookie['mon_nom'] = "ma_valeur"
#expiration
le_cookie['mon_nom']['expires'] = 30 * 24 * 60 * 60
#chemin
le_cookie['mon_nom']['path'] = "/"
#limitation pour un domaine
le_cookie['mon_nom']['domain'] = ".mon_site.com"
print le_cookie
print "Content-Type: text/html\n"

exemple de récupération d'un cookie

#! /usr/bin/python
import cgitb,os,Cookie
cgitb.enable()
le_cookie = Cookie.SimpleCookie()
chaine_serialise = os.environ.get('HTTP_COOKIE')
le_cookie.load(chaine_serialise)
ma_valeur = le_cookie['mon_nom'].value

print "Content-Type: text/html\n\n"
print ma_valeur

Python, le web et les sessions

Il n'existe pas de module directement utilisable pour gérer les sessions comme c'est le cas avec un langage comme php.
Il est possible de gérer la persistance des informations avec les cookies. Plusieurs solutions existent pour combler ce vide.
Pour citer juste que quelques solutions....
-Le framework Cherrypy vous propose de nombreux outils pour effectuer des développements web et en particulier une gestion des sessions.
-Le projet Jon py propose un module session
-Pour faire simple et direct une classe est disponible sur CodePoint.net en cliquant sur ce lien. Elle utilise les cookies pour stocker un identifiant de session et stocke les données dans un fichier sur le serveur. Il faudra certainement remanier le code pour stipuler un répertoire valide sur votre hébérgement. Il utilise le module shelve.
Cet exemple montre qu'il est tout à fait envisageable de développer assez rapidement un module proche des techniques décrites dans la fonction session_set_save_handler de php à savoir les méthodes open, read, close, write, destroy et la gestion du garbage collector.
Voila un projet intéressant...

Quelques fonctions utiles dans le module python "os" et "shutil"

Les exemples valent mieux que des longs textes... voir ci-dessous

#! /usr/bin/python
import cgitb,os
cgitb.enable()
print "Content-Type: text/html\n\n"

#chemin du script courant depuis la racine
#sans le nom du script print os.getcwd() #change de répértoire courant os.chdir("repertoire") #change le nom d'un fichier os.rename("fichier_source","fichier_destination") #créé un répertoire os.mkdir("mon_repertoire") #liste les fichiers d'un répértoire #et conseigne les résultats dans un tableau print os.listdir("mon_repertoire") #execution d'une commande system os.system("commande") #nom de la page appelante (referer) print os.getenv("HTTP_REFERER","") #le fichier existe-il ? indique vrai #si la condition est remplie if os.path.exists("mon fichier"): etc... #nom est-il un fichier ? indique vrai #si la condition est remplie if os.path.isfile("nom"): etc... #nom est-il un répertoire ? indique vrai #si la condition est remplie if os.path.isdir("nom"): etc... #copy d'un fichier en gardant les permissions shutil.copy("lisezmoi.txt","blabla.txt") #copy d'un fichier sans garder les permissions shutil.copyfile("lisezmoi.txt","blabla.txt")

Conclusion

L'idée était de présenter quelques pistes générales pour prendre rapidement en main un langage comme Python sur votre hébérgement mutualisé et pouvoir ensuite se laisser à pythonner...
Pouvoir executer un code python, se connecter à une base de données, traiter les données d'un formulaire, écrire ou lire des fichiers, utiliser des cookies permet déjà de mettre en place des fonctionnalités indispensables pour un site web.
Maintenant le plus dur reste à faire.. Plonger au coeur du langage !
Utiliser Python uniquement pour faire du web c'est peu dommage. Php est très bien pour ca. L'intérêt est d'apprendre à utiliser un langage très puissant et souple qui pourra servir pratiquement à faire tout n'importe où : sous Linux, sous Windows, avec ou sans Apache, sur le web, pour créer une application, pour les mobiles etc...

Liens utiles concernant Python

Voici une liste de liens concernant le langage Python. Cette liste n'est pas exhaustive.

Site officiel Python
Documentation de la version 2.5.2 en anglais
Projet de documentation Python en français
Site officiel de Mod_Python (module apache permettant le fonctionnement de Python dont le développement a été malheureusement stoppé)
Article intéressant concernant la gestion des cookies avec python
Page officielle de CherryPy, un framework orienté objet permettant de gérer facilement les problématiques liées à l'utilisation de Python sur le web (sessions, cookies etc...)
Le module jonpy ouvre une voie de réponse intéressante sur le problème des sessions sur python (un peu à la manière de php) Développez.com
Un tutoriel sur Python qui a le mérite d'être clair (à condition de pratiquer l'anglais)
PythonFrance.com
Association Francophone Python

Les meilleurs bibliothèques pour Python

 

 

Fabrice de Caluwe - Reproductions interdites - Mis à jour le 07-10-2010