7.2. Services Karrigell

7.2.1 Syntaxe

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 C'est le style de programmation le plus recommandé pour écrire des scripts pour Karrigell, par leur facilité de programmation (l'accès aux données utilisateur est plus simple) et de maintenance (toute la logique de l'application est regroupée dans un seul script)

Pour cela, les fonctions définie au niveau module 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

Ceci rend le passage d'arguments d'une page à l'autre extrêmement simple et lisible : si une page a un lien comme

<A HREF="script.ks/foo?bar=99">

le script gèrera la valeur en la définissant comme argument :

def foo(bar):
    print bar

Les valeurs d'un formulaire sont gérées sous une forme similaire :

<FORM ACTION="script.ks/foo">
<INPUT NAME="bar">
<INPUT TYPE="submit" VALUE="Ok">

Le même script que ci-dessus gèrera la valeur entrée par l'utilisateur :

def foo(bar):
    print bar

Les noms définis comme arguments de la fonction doivent être les mêmes que ceux définis dans le lien ou le formulaire ; la fonction peut aussi avoir des valeurs par défaut comme dans les scripts Python ordinaires, au cas où aucune valeur n'a été envoyée par le navigateur :

def foo(arg1,arg2=None):
    print "Premier argument",arg1
    if arg2 is not None:
    	print "Second argument",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

7.2.2 Construction d'applications

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

7.2.3 Fonctions "privé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é (_)

def _privee(valeur):
   """Fonction privée - ne peut pas être appelée par une URL"""
   return valeur+1

7.2.4 Exemple

Voici un exemple de Service Karrigell simple, qui utilise la gestion de session et la redirection HTTP pour gérer un compteur :

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