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() %>
Dans cet exemple vous remarquerez que vous n'êtes pas obligé d'importer explicitement le module 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 :
    1. quand un morceau de code Python se termine par deux points (:) l'indentation de ce qui suit est incrémentée de 1
    2. 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