7.3. Python Inside HTML
Python Inside HTML se comporte de façon très proche des Active Server Pages de Microsoft, des Java Server Pages et de PHP : il s'agit à la base d'un document HTML, dans lequel on insère des portions de code écrites dans un langage de programmation - ici Python
Dans Python Inside HTML, ces portions de code sont séparées du code HTML à l'intérieur de balises spéciales : <% et %>
Supposons que vous vouliez afficher la date courante, vous mêlerez du HTML et du code Python de cette façon :
La date courante est <% import time print time.strftime("%d:%m:%y",time.localtime(time.time())) %>
Avec un éditeur de texte, écrivez le code ci-dessus et sauvegardez-le sous date.pih dans votre Répertoire Racine . Entrez http://localhost/date.pih et voyez ce qui se passe
Vous aurez remarqué que le code à l'intérieur des balises <%
et %>
est du code Python ordinaire, dans lequel vous pouvez
importer des modules, créer et instancier des classes, utiliser des variables,
lire ou écrire des fichiers, etc. L'accès à l'environnement HTTP, aux champs
de formulaires, aux exceptions définies par Karrigell se fait de la même façon
que pour les scripts Python
7.3.1 Variables Python
Si vous voulez seulement imprimer la valeur d'une variable, au lieu de
<% print var %>
vous pouvez utiliser le raccourci
<%= var %>
:
Le répertoire courant est <%= os.getcwd() %>
os
: par commodité, il est déjà dans
l'espace de noms quand vous exécutez le script ; ainsi que deux autres
modules, string
et Cookie
, parce que vous en aurez
sûrement besoin dans beaucoup de scripts (mais bien sûr, si vous écrivez
explicitement import string
votre script fonctionnera aussi bien)
7.3.2 Chaînes de caractères à traduire
Comme l'internationalisation est importante dans Karrigell, il existe un raccourci pour les chaînes littérales ou les variables de type chaîne que vous voudrez traduire selon les préférences de l'utilisateur : utilisez<%_ chaine %>
<% import time %> <%_ "Le répertoire courant est " %> <%= os.getcwd() %> <%_ "Date courante " %> <%_ time.strftime("%a",time.localtime()) %>
Si vous avez préparé une traduction pour la chaîne Le répertoire
courant est
, quand l'utilisateur appelle le script et que sa
référence de langue est l'anglais, son navigateur affichera Current
directory is
Voir le support de Karrigell pour l'internationalisation
7.3.3 Indentation
Le résultat du traitement d'un fichier PIH est du code Python : ce code doit être indenté. Comme un script PIH est un mélange de HTML, dans lequel l'indentation ne sert à rien d'autre qu'à la lisibilité, et de morceaux de code Python, il se peut qu'il soit difficile de produire un code qui soit à la fois lisible et correctement indenté
7.3.3.1 Bases
PythonInsideHTML suit des règles simples :- au début d'un script, l'indentation est nulle
- chaque partie est indentée selon l'indentation courante
- cette indentation courante peut être modifiée de deux façons :
- quand un morceau de code Python se termine par deux points (:) l'indentation de ce qui suit est incrémentée de 1
- pour décrémenter l'indentation utiliser
<% end %>
Un simple exemple sur des conditions :
# indentation
<% if heure<18: %> Bonjour <% end> <% else: %> Bonsoir <% end> Mesdames et Messieurs
# 0 - suivante : 1 # 1 # 1 - suivante : 0 # 0 - suivante : 1 # 1 # 1 - suivante : 0 # 0
et une boucle for
:
# indentation
<table border=1> <tr> <th>Nombre</th> <th>Carré</th> </tr> <% for i in range(10): %> <tr> <td><% print i %></td> <td><% print i**2 %></td> </tr> <% end %> </table>
# 0 # 0 # 0 # 0 # 0 # 0 - suivante : 1 # 1 # 1 # 1 # 1 # 1 - suivante 0 # 0
Sans cette balise <% end %>
la balise
</table>
aurait été insérée dans la boucle
Un dernier avec deux niveaux d'indentation
# indentation
<% for i in range(10): %> <% if i % 2: %> <td class="impair"><%= i %></td> <% end %> <% else: %> <td class="pair"><%= i %></td> <% end %> <% end %> Fin de table
# 0 - suivant : 1 (A) # 1 - suivant : 2 # 2 # 2 - suivant : 1 # 1 - suivant : 2 # 2 # 2 - suivant : 1 # 1 - suivant : 0 # 0
Noter qu'après la 1ère ligne il faut impérativement fermer la balise %>, sinon après la deuxième l'indentation ne sera que de 1
7.3.3.3 La balise <indent>
Pour du code plus long ou plus complexe, l'utilisation de
<% end %>
peut se révéler lassante. Si vous voulez que certaines
parties de votre code soit indentées en Python comme elles le sont dans le
code PIH, insérez-le avec la balise <indent>
Premier exemple :
# indentation
<indent> <% if hour<18: %> Bonjour <% else: %> Bonsoir Mesdames et Messieurs </indent>
# 0 # 0 # 1 # 0 # 1 # 0 # 0
Le deuxième :
# indentation
<table border=1> <tr> <th>Nombre</th> <th>Carré</th> </tr> <indent> <% for i in range(10): %> <tr> <td><% print i %></td> <td><% print i**2 %></td> </tr> </indent> </table>
# 0 # 0 # 0 # 0 # 0 # 0 # 0 (A) # 1 # 1 # 1 # 1 # suivante : 0 # 0
Sur la ligne notée (A) ci-dessus vous voyez que l'indentation de la ligne
est relative à celle de la balise <indent>
Notez aussi qu'après une partie indentée (après la balise
</indent>
) l'indentation revient à zéro
Un exemple avec des boucles imbriquées :
<indent> <table border=1> <% for i in ['h']+range(10): %> <tr> <% for j in ['h']+range(10): %> <% if i!='h' and j!='h': %> <td><%= i*j %></td> <% elif i!='h': %> <th><%= i %></th> <% elif j!='h': %> <th><%= j %></th> <% else: %> <td>*</td> </tr> </table> </indent>
7.3.4 PIH comme système de templates
Les scripts PIH scripts peuvent être utilisés en-dehors du serveur Karrigell pour générer des pages HTML, ce qui en fait un "système de templates"Par exemple, cette documentation HTML est produite à partir de scripts PIH. Le numéro de chapitre n'est pas fixe, mais inséré de cette façon :
<h1><%= chapter %>. Python Inside HTML</h1>
Pour produire du HTML à partir d'un script PIH script, servez-vous du
module Template
, créez une instance de Script avec la fonction
getScript(nomFichier)
, puis appliquez-lui la
méthode render(espaceDeNoms)
, en lui passant l'espace
de noms dans lequel il trouvera les variables requises (en général
globals()
ou locals()
). render
retourne une
instance de Output, dont l'attribut value
donne le résultat en
HTML. Ici :
import Template entree=Template.getScript("pythoninsidehtml.pih") chapter=5 sortieHtml=entree.render(globals()).value
7.3.5 Débogage
A des fins de débogage lancez le script
PIHapp.py
. C'est une petite application qui
montre comment les fichiers PIH sont traduits en scripts Python. Le résultat du script peut être
sauvegardé dans un fichier HTML et montré dans un navigateur, s'il n'appelle pas de variable
externe. La syntaxe est colorée