Applications web en Python : panorama et déploiement

Authors: Gael Pasgrimaud
Date: $Date: 2008-07-2$
Ce tutoriel présente un panorama des frameworks web existant en python et la facon de les déployer à l'aide de la norme WSGI.

Frameworks bas niveaux

Exemple web.py

import web

urls = (
  '/(.*)', 'hello'
)

class hello:
  def GET(self, name):
    if not name: name = 'world'
    print 'Hello,', name+'!'

if __name__ == "__main__":
  web.run(urls, globals())

Pylons

La commande:

$ paster controller hello

Devient:

class HelloController(BaseController):

  def index(self):
    return 'Hello'

Avantages / Inconvénients

Frameworks haut niveau

Django

Framework complet intégrant une interface d'administration pré-mâchée.

TurboGears

Le lieur de briques.

Zope

L'usine. Seule véritable base de données objets.

Grok

Aide à la construction d'usine Zope.

Avantages / Inconvénients

Problématique déploiement

Utilisation de virtualenv

Création d'environnement isolé:

$ virtualenv --no-site-packages monprojet

=> Nouveaux binaires python

Utilisation de zc.buildout

buildout.cfg:

[buildout]
parts=eggs

[eggs]
recipe=zc.recipe.egg
eggs=
  supervisor
  PasteScripts
  Pylons
  mon.app

=> Modification du PYTHON_PATH

Bâtir son application

Utilisation de templates:

$ paster create -t basic_package monprojet

Utilisation de distutils

setup.py

Développement:

$ python setup.py develop

Release:

$ python setup.py sdist bdist_egg
                  register upload

Les points d'entrées

entry_points = """
[console_scripts]
buildout = zc.buildout.buildout:main

[super_points]
...
"""

WSGI vous sauve la vie

Composition

En image

WSGI

Application

Implémentation simple:

def application(environ, start_response):
    start_response('200 OK',
            [('Content-Type', 'text/html')])
    return ['Hello']

Existant

La variable environ (1/2)

La variable environ (2/2)

Monde du milieu (1/2)

Interagit à la fois avec l'application et avec le serveur.

Monde du milieu (2/2)

Notification des erreurs de l'application:

class ErrorHandler(object):

    def __init__(self, app):
        self.application = app

    def __call__(environ, start_response):
        try:
          return self.application(environ,
                                  start_response)
        except Exception, e:
          # notification de l'admin
          ...
          raise

Existant

Une implementation: Paste

Configuration de type INI

Une application simple

deploy.ini:

[app:main]
use = egg:mon.package#mon_application
email = gawel@afpy.org

[server:main]
use = egg:Paste#http
host = 127.0.0.1
port = 5000

Lancement de l'application:

paster serve deploy.ini

Les frameworks

En savoir plus

Remerciements

Questions ?