.. include:: ==================================================== Applications web en Python : panorama et déploiement ==================================================== :Authors: Gael Pasgrimaud :Date: $Date: 2008-07-2$ .. Cette présentation et les éléments de contenus associés sont placés dans le .. domaine public. .. class:: small * Panorama * Problématique de déploiement * Vous avez dit problématique ? .. container:: handout 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. .. contents:: :class: handout .. |bullet| unicode:: U+02022 .. |mode| unicode:: U+00D8 .. capital o with stroke .. footer:: Mont-de-Marsan |bullet| 2008-07-02 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 En image ======== .. figure:: images/wsgi.png :alt: WSGI :align: center :height: 550 :width: 750 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 Les frameworks ============== * web.py - http://webpy.org/ * Python Paste - http://pythonpaste.org/ * Pylons - http://pylonshq.com/ * TurboGears - http://turbogears.org/ * Django - http://www.djangoproject.com/ * Zope - http://www.zope.org * Grok - http://grok.zope.org En savoir plus ============== * pypi - http://pypi.python.org * PEP333 - http://www.python.org/dev/peps/pep-0333/ * wsgi.org - http://wsgi.org/wsgi Remerciements ============= * Logilab - http://logilab.com * Nerim - http://www.nerim.fr * Ingeniweb - http://www.ingeniweb.com Questions ? ===========