Karrigell Documentation

Version 2.3.1 02 09 06

English

10. Services Karrigell

10.1 Syntax

Les "services Karrigell" sont des scripts Python qui peuvent gérer en même temps plusieurs URL, ce qui permet de développer un service complet (plusieurs pages HTML distinctes) en un seul script

Pour cela, les fonctions d'un service Karrigell sont associées à une URL : la fonction foo() du script monScript.ks est appelé par l'URL dummy.ks/foo

Pour appeler foo(arg1,arg2) l'URL doit être de la forme monScript.ks/foo?arg1=val1&arg2=val2 ou être appelée par un formulaire avec les champs arg1 et arg2

Si aucune fonction n'est spécifiée, Karrigell cherche une fonction appelée index(), sans argument

Notez que pour des raisons de sécurité et de lisibilité, seules les fonctions explicitement définies dans le script ks et dont la définition commence à la 1ère colonne du code source peuvent être appelées

Si vous avez besoin de fonctions internes au script mais que vous ne voulez pas qu'on puisse les appeler par une url, faites-les commencer par un signe souligné (_)

Pour "sauter" d'une fonction à l'autre, il suffit de spécifier le nom de la fonction dans un lien ou une action de formulaire :

def index():
   print '<a href="foo?nom=bar">Aller vers foo</a>'
def foo(nom):
   print '<IMG SRC="../picture.jpg">'
   print nom

Remarquez la première ligne de la fonction foo() : à cause des méthodes de résolution des URL, l'URL relative des fichiers et des scripts qui se trouvent dans le même répertoire qu'un script ks doit être préfixé par "../"

Tout l'environnement HTTP, les champs de formulaires, les exceptions spécifiques, les fonctions pour l'authentification, la gestion de sessions, etc. sont les mêmes que pour les scripts Python

Voici un exemple de Service Karrigell simple :

so = Session()
if not hasattr(so, 'x'):
    so.x = 0
def index():
    print "x = %s" %so.x
    print '<br><a href="increment">Incrémenter</a>'
    print '<br><a href="decrement">Décrémenter</a>'
    print '<br><a href="reset">Remise à zéro</a>'
    
def increment():
    so.x = _private(so.x)
    raise HTTP_REDIRECTION,"index"
def decrement():
    so.x -= 1
    raise HTTP_REDIRECTION,"index"
def reset():
    so.x = 0
    raise HTTP_REDIRECTION,"index"
def _private(x):
    """Le nom de la fonction commence par _ : fonction interne, 
    ne peut pas être invoquée par une url"""
    return x+1

10.2 urls intelligentes

Dans certains cas il peut être utile d'accéder à des fonctions de services Karrigell avec des urls qui précisent des paramètres additionnels. Par exemple, l'url htpp://path/service.ks/fonction/foo/bar?nom=martin appelerait la fonction avec 'foo' et 'bar' comme paramètres

On peut les récupérer dans le script par un attribut de THIS appelé subpath. Dans l'exemle ci-dessus, il aurait pour valeur la liste ['foo','bar']

def fonction(nom):
   print 'subpath ',THIS.subpath
   print nom

Un problème avec ces "url intelligentes" est que s'il faut écrire un lien, ou utiliser Include(), ou faire une redirection vers une url relativ, il faut donner la bonne url au navigateur, c'est-à-dire la faire précéder du bon nombre de '../'

Ce nombre est calculé d'après la longueur de l'attribut subpath : pour écrire un lien dans la fonction ci-dessus il faut écrire ceci

def fonction(nom):
   print 'subpath ',THIS.subpath
   print nom
   print '<a href=%slogin>Identifiez-vous</a>' %('../'*len(THIS.subpath))
ou utiliser un raccourci, l'attribut de THIS appelé up :

def fonction(nom):
   print 'subpath ',THIS.subpath
   print nom
   print '<a href=%slogin>Identifiez-vous</a>' %THIS.up