16
juil.
'09

Cheap and Tiny Web Framework (CaT)

Publié le 16 juillet 2009

CaT (Cheap and Tiny) est un framework que j'avais présenté lors de la Nuit du hack 2009 durant ma conférence sur les frameworks web next-gen. Je n'avais pas diffusé les sources, car le projet n'était pas abouti.

Il est tout juste opérationnel (version présentée lors de la nuit du hack) mais cela permettra d'illustrer les slides.

*Installation: howto*

Le framework web est diffusé sous forme de package python, et son installation est aisée:

$ tar xvzf cat-2.3.tar.gz
$ cd cat-2.3
$ python setup.py install

Il faut ensuite s'assurer que la lib modpython pour apache2 est bien installée:

# apt-get install libapache2-mod-python

Puis il faut configurer correctement le virtualhost. Voici un exemple de configuration:

NameVirtualHost *
<VirtualHost *>
    ServerAdmin webmaster@localhost

    DocumentRoot /var/www/
    <Directory /var/www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride None
            Order allow,deny
            allow from all

            SetHandler python-program
            PythonHandler cat.core.handler
            PythonDebug On

    </Directory>

    ErrorLog /var/log/apache2/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /var/log/apache2/access.log combined
    ServerSignature On
</VirtualHost>

La directive SetHandler indique à apache que le handler à employer est un programme python, tandis que la directive PythonHandler cat.core.handler spécifie la fonction python qui est chargée de gérer les requêtes effectuées sur le directory. Enfin, la directive PythonDebug On active le debug afin de provoquer l'affichage des exceptions dans la page générée, au lieu d'une simple erreur 500.

Une fois le framework installé et le virtualhost configuré, il ne reste plus qu'à placer à la racine du DocumentRoot un fichier de configuration dédié à CaT, nommé cat.conf, et qui va être chargé de gérer le mappage des packages (je vais expliciter ce principe dans pas longtemps). Voici à quoi ressemble ce fichier:

Site localhost
AddPackage /home/virtualabs/ndh2k9/demo             /

Cet ensemble de directives indiquent à CaT de mapper le package demo à la racine pour le virtualhost "localhost". De fait, CaT peut être employé pour de l'hébergement mutualisé. Une fois cette configuration effectuée, il ne reste plus qu'à voir comment un package est créé, et de quoi il est constitué.

*Package: creation*

Un package est un module python contenant une classe nommée Handler, qui respecte la structure suivante:

# cat imports
from cat.template import CatTemplate,Context
from cat.http import HttpAuthAgent,HttpResponse
from cat.package import CatPackage

class Handler(CatPackage):

    def __init__(self,packageName,packageRoot):
            CatPackage.__init__(self,packageName,packageRoot)

            # handlers setup
            self.HANDLERS = [
            ('/index.php',self.Index),
            ]

            self.MEDIAS = [
            ('/banniere','banniere.png'),
            ]

            self.setTemplatePath('templates')

    def Index(self,request,session):
            tpl = self.LoadTemplate('template.html')
            return HttpResponse(tpl.render({}))

Le module ici présent installe un handler, gérant une page nommée 'index.php' (oui, on peut fausser les extensions), et mettant à disposition une image accessible via l'uri /banniere mais étant en réalité une image PNG stockée à la racine du module.

L'ensemble des ressources mises à disposition par le package est mappé par rapport au point de montage défini dans le fichier cat.conf. L'arborescence est, comme je l'ai indiqué lors de la conférence, purement virtuelle car les ressources ne correspondent pas à des fichiers, mais à des méthodes qui sont ainsi mises à disposition du visiteur.

Le framework web CaT emploie le système de templates de Django, et possède quelques primitives permettant de manipuler la configuration des templates:

self.setTemplatePath('templates')

Cette ligne de code précise le répertoire (par rapport à la racine du module) contenant les templates.

Pour terminer, la méthode Index() sera appelée lors d'une requête sur la ressource /index.php. Elle prend deux arguments, une instance de la requête (permettant de récupérer les paramètres passé par l'url et via la méthode POST, et les méta-informations classiques (IP du client, etc ...), et un second argument permettant de manipuler des sessions un peu comme avec les sessions PHP. Dans cet exemple, elle se charge de récupérer le template "template.html", et le renvoie en tant que page générée.

*Téléchargements*

Et voila donc, en toute primeur le package livré sous forme de source, accompagné (tant qu'à faire) du package exemple que j'avais réalisé pour la nuit du hack.

Source installation (Cat-2.3) Package demo (NDH2k9)


Les contenus disponibles sur ce blog sont publiés sous licence Creative Commons BY-NC-SA.
Vous pouvez réutiliser tout ou partie de ces contenus à condition de citer l'auteur et l'origine, vous ne pouvez en faire une utilisation commerciale, et enfin vous devez partager tout travail ou œuvre dérivée sous les mêmes conditions — c'est-à-dire avec la même licence d'utilisation Creative Commons.