WSGI par l'exemple

Authors: Gael Pasgrimaud
Date: $Date: 2008-05-18$
Ce tutorial présente la norme WSGI (PEP 333) visant à normaliser les application web écritent en Python

Pourquoi WSGI ?

Qu'est ce que WSGI ?

Norme visant à décrire le processus de publication d'une application web.

Composition

Se découpe en 3 parties:

Serveur

Non détaillé ici. Il est chargé de desservir les pages web. Il en existe un grand nombre:

Application 1/2

C'est le corps du processus. Il contient toute la logique applicative. Un grand nombre de framework supporte le WSGI:

Application 2/2

Implémentation simple:

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

La variable environ (1/2)

La variable environ (2/2)

Monde du milieu (1/2)

Interagis à 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

Une implementation: Paste

Ensemble de librairie implementant la norme

Configuration de type INI

Factory (1/2)

Factory (2/2)

Factory avec configuration:

def mon_application(global_config,
                    **local_config):
    # on utilise le factory
    #pour configurer la notification
    app = ErrorHandler(application,
                       local_config['email'])
    return app

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

Eléments de configuration (1/2)

app: une application:

[app:mon_application]
use = egg:mon.package#ma_super_application

filter: monde du milieu:

[filter:error_handler]
use = egg:mon.package#error_handler

pipeline: permet un enchaînement monde du milieu / application:

[pipeline:main]
pipeline = error_handler mon_application

Eléments de configuration (1/2)

composite: permet de combiner des applications:

[composite:main]
use = Paste#urlmap
/app1 = mon_application
/app2 = mon_application2

server: permet un choix de serveur:

[server:main]
use = PasteScript#cherrypy
host = 127.0.0.1
port = 5000

Paste utilise les section :main comme point d'entrée puis construit l'application

En savoir plus

Crédits