Applications web en Python : panorama et déploiement
Authors: |
Gael Pasgrimaud |
Date: |
$Date: 2008-07-2$ |
- Panorama
- Problématique de déploiement
- Vous avez dit problématique ?
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
- web.py
- cherrypy
- WebOb
- Paste
- Pylons
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
- prise en main rapide
- la roue existe déjà
Frameworks haut niveau
- Django
- TurboGears
- Zope
- Grok
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
- prise en main lente (voire très lente)
- nombreuses briques existantes
Problématique déploiement
- Environnements de développement
- Bâtir son application
- Utilisation de plusieurs frameworks.
- Cohabitation entre ces frameworks.
- Partage de code entre les applications.
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
- Web
- Server
- Gateway
- Interface
Composition
- Application
- Serveur
- Monde du milieu
Application
Implémentation simple:
def application(environ, start_response):
start_response('200 OK',
[('Content-Type', 'text/html')])
return ['Hello']
Existant
- paste
- Pylons
- Zope
- Django
- ...
La variable environ (1/2)
- Simple dictionnaire
- Contient l'environnement pour une requête
- Valeurs d'un environnement HTTP classique (PATH_INFO, HTTP_HOST, etc.)
- Valeurs spécifiques à la norme (wsgi.*)
La variable environ (2/2)
- wsgi.url_scheme http / https
- wsgi.input Flux d'entrée en lecture contenant la requête (stdin)
- wsgi.errors Flux de sortie permettant de tracer les erreurs. (stderr)
- wsgi.run_once Vrai si l'application n'est évaluée qu'une fois dans la vie
du processus. (CGI / Tests)
Monde du milieu (1/2)
Interagit à la fois avec l'application et avec le serveur.
- modifie le comportement d'une application
- permet la cohabitation d'applications
- modifie le résultat renvoyé au 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
- Authkit
- Beacker
- iw.thumbs
- ...
Une implementation: Paste
- Ensemble de librairies
implémentant la norme
Configuration de type INI
- Configuration organisée en sections
- Configurable par un administrateur
sans notion de python ni de developement.
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
Questions ?