Tutoriel de web.py


Ceci est un tutoriel de juillet 2006 pour la vieille version 0.1 du framework web en python web.py. La version 0.2 sortie depuis rends ce tutoriel totalement dépassé.

[Logo de Webpy]

  1. Installation
  2. Gestion des URLs
  3. Templates
  4. URLs sur mesure
  5. Bases de données
  6. Cookies

Installation

Si vous voulez faire l’ensemble de ce tutoriel vous devrez installer web.py, flup, Cheetah, psycopg2 et Postgres. Pour plus de détails voir le site de web.py.

Gestion des URLs

Créez un nouveau fichier dans le dossier où vous aurez enregistré le module web.py. Appelez le code.py par exemple.

import web

Ceci importera le module web.py.

urls = (
    '/', 'view'
)

Ceci est la liste qui applique une fonction à une url. La première partie est l’expression régulière qui représente un chemin. Par exemple : /, /aide/faq, /article/(\d+), etc. (Le \d+ représente une séquence de chiffres. (Les parenthèses servent à capturer les éléments retournés pour plus tard.) La deuxième partie est le nom d’une classe à laquelle envoyer la requête, comme view, welcomes.hello (qui utilise la classe hello du module welcomes) ou get_\1. \1 est remplacé par la première capture de l’expression régulière. Toutes captures restantes seront passées à la fonction.

class view:
    def GET(self):
        print 'Bonjour, monde !'

Voici la classe view avec sa fonction GET. Comme vous avez pu le deviner, GET est appelé lorsque quelqu’un appelle la méthode HTTP GET sur votre URL (c’est-à-dire quand ils la visitent avec un navigateur web). La dernière ligne renvoie le texte brut « Bonjour, monde ! » au visiteur.

web.internalerror = web.debugerror

Cette ligne dit à web.py d’afficher une page avec plein d’informations de déboggage dès qu’il rencontre une erreur. Commentez cette ligne quand vous lancerez votre site pour éviter que les utilisateurs ne les voient.

if __name__ == '__main__': web.run(urls, web.reloader)

Ceci dit à web.py de lancer votre application quand le fichier est exécute. Le premier argument, urls, est la liste qu’on a définie plus haut. Les autres arguments sont des fonctions internes middleware qui peuvent aider certaines parties de votre application. Ici on utilise le reloader, qui recharge automatiquement le code source à chaque fois qu’on le modifie. De cette façon on évite de devoir relancer le serveur à chaque fois. Vous voudrez probablement le retirer quand votre site sera rendu public mais c’est extrêmement utile au moment du développement. Il y a aussi web.profiler, qui montre de l’information sur le temps que mets chaque fonction à la fin des pages web, de façon à optimiser votre code.

Pour lancer le serveur web faisant tourner votre application tapez dans une invite de commande (vous pouvez spécifier le port en le passant comme paramètre) :

$ python code.py

Maintenant si vous visitez http://0.0.0.0:8080/ avec un navigateur web, vous devriez voir apparaître « Bonjour, monde ! ».

Vous pouvez aussi lancer code.py en tant que script CGI ou un script FastCGI. Comme web.py est construit sur WSGI, le standard Python pour les applications web, vous pouvez le lancer avec un tas d’autres choses, comme mod_python, si vous voulez.

Templates

Note : pour suivre cette partie du tutoriel vous devez installer le système de templates Cheetah. Ce tutoriel d’une page couvre toutes ses caractéristiques essentielles.

Créez un nouveau dossier nommé templates. Dedans créez un nouveau fichier qui finit par .html, comme par exemple view.html.

#if $name
    Je voulais juste passer le bonjour à $name.
#else
    Bonjour, monde !
#end if

Maintenant retournez sur code.py. Changez view.GET en :

        name = 'Robert'
        web.render('view.html')

Maintenant si vous visitez votre site dans un navigateur, il devrait dire bonjour à Robert.

Attention : le système de templates de web.py est en voie d’être remplacé par quelque chose de globalement équivalent mais un peu plus simple et plus puissant dont l’implémentation n’est pas encore finie.

URLs sur mesure

Changez votre liste d’URLs de la façon suivante :

    '/(.*)', 'view'

Maintenant changez la définition de view.GET en :

class view:
    def GET(self,name):
        web.render('view.html')

Maintenant si vous visitez /Michel vous devriez le voir dire bonjour à Michel. Si vous visitez / il devrait dire « Bonjour, monde ! ».

Bases de données

Note : pour suivre cette partie du tutoriel vous devez installer un système de gestion de bases de données tel que PostgreSQL ou MySQL.

Au dessus de la ligne avec web.run, ajouter :

web.db_parameters = dict(dbn='postgres', user='me', pw='pass', db='dbname')

En changeant les valeurs pour refléter votre configuration de bases de données. Par exemple, les utilisateurs de MySQL changeront la valeur de dbn en mysql.

Créez une table dans votre base de données :

CREATE TABLE todo (
  id serial primary key,
  title text,
  created timestamp default now(),
  done boolean default 'f'
);

Et insérez une ligne dans cette table : INSERT INTO todo (title) VALUES ('Apprendre web.py');

De retour dans code.py ajoutez cette ligne au début de view.GET :

        todos = web.select("todo")

Éditez view.html pour qu’il y ait :

<ul>
   #for todo in $todos
       <li id="t$todo.id">$todo.title</li>
   #end for
</ul>

En visitant votre site vous devriez désormais voir une chose à faire dans votre liste : « Apprendre web.py ».

Ajoutez à la fin de view.html :

<form method="post" action="add">
    <p><input type="text" name="title" />
    <input type="submit" value="Add" /></p>
</form>

Changez votre liste d’URLs en :

    '/', 'view',
    '/add', 'add'

Changez view.GET pour qu’il ne prenne plus de paramètres additionnels :

    def GET(self):

Et en dessous de la classe view ajoutez :

class add:
    def POST(self):
        i = web.input()
        n = web.insert('todo', title=i.title)
        web.seeother('./#t'+str(n))

web.insert retourne l’id du nouvel élément inséré puis web.seeother est utilisé pour rediriger l’utilisateur dessus.

Rapidement : web.transact() commence une transaction, web.commit() la soumet, web.rollback() l’interrompt. web.update fonctionne exactement comme web.insert sauf qu’au lieu de retourner un id il le prends (ou une chaîne avec la clause WHERE) comme paramètre après le nom de la table.

Maintenant vous pouvez ajouter des éléments à votre liste.

À noter : l’Objet de Stockage

À la fois web.input et web.query, ainsi que plein d’autres éléments dans web.py, retournent des « Objets de Stockage » (Storage Objects). Un objet de ce type est comme un dictionnaire à la différence que d.foo est la même chose que d['foo']. Cela évite beaucoup de saisies.

Cookies

Les cookies fonctionnent pratiquement de la même manière que web.input. web.cookies() retourne un Objet de Stockage avec l’ensemble des cookies enregistrés. web.setcookie(name, value, expires="") enregistre un nouveau cookie.

À la fois web.input et web.cookies prennent une série d’arguments et de mots-clefs. Si vous appelez web.input('color', times=1), par exemple, il enverra une erreur s’il ne trouve pas d’argument appelé color. Et s’il ne trouve pas d’argument appelé times il lui assignera la valeur 1.

Une façon habituelle de procéder est :

try: i = web.input('foo', bar=2)
except KeyError: return web.badrequest()

Fin du tutoriel pour l’instant. La suite : form.py.

Vous en voulez plus ? Ne ratez pas la documentation complète (en).