Jinja (moteur de template)

Un article de Wikipédia, l'encyclopédie libre.
Jinja
Description de l'image Jinja software logo.svg.

Informations
Développé par Armin Ronacher (en)Voir et modifier les données sur Wikidata
Dernière version 3.1.3 ()[1]Voir et modifier les données sur Wikidata
Dépôt github.com/pallets/jinjaVoir et modifier les données sur Wikidata
Écrit en PythonVoir et modifier les données sur Wikidata
Type Bibliothèque logicielle
Système de gabarit
Bibliothèque logicielle Python (d)
Template language (d)Voir et modifier les données sur Wikidata
Licence BSD 3-clausesVoir et modifier les données sur Wikidata
Site web palletsprojects.com/p/jinjaVoir et modifier les données sur Wikidata

Jinja est un moteur de template utilisé par le langage Python. Créé par Armin Ronacher et distribué sous licence BSD, il est très similaire au moteur de template Django mais fournit des expressions Python et évalue les templates dans une sandbox. C'est un langage orienté texte qui peut ainsi être utilisé pour générer n'importe quel type de fichier pouvant être balisé.

Ce moteur permet certaines personnalisations de tags[2], de filtres, de tests, et d'expressions[3]. Cependant contrairement à Django, Jinja permet au développeur d'appeler des fonctions avec des arguments sur des objets. Jinja, comme Smarty, utilise également un système de filtre qui se rapproche du Unix pipeline.

Jinja est basé sur le framework Flask[4] et utilisé par Ansible[5],[6], Trac, et Salt. Il aurait inspiré Twig, le moteur de template de PHP.

Fonctionnalités[modifier | modifier le code]

Voici quelques-unes des fonctionnalités[7] :

  • exécution dans un bac à sable
  • encodage et filtrage automatique des documents HTML pour se prémunir des attaques de type cross-site scripting (XSS)
  • héritage de templates
  • Compilation Python "Just in time"
  • Pré-compilation en avance des templates (option)
  • Debuggage simplifié (les exceptions pointent directement sur la ligne incriminée du template)
  • Syntaxe configurable

Exemple[modifier | modifier le code]

Voici un exemple simple de template HTML dont le nommage du fichier doit être suffixé .jinja[8]:

<!DOCTYPE html>
<html>
  <head>
    <title>{{ variable|escape }}</title>
  </head>
  <body>
  {%- for item in item_list %}
    {{ item }}{% if not loop.last %},{% endif %}
  {%- endfor %}
  </body>
</html>

Le code template :

from jinja2 import Template
with open('example.html.jinja') as f:
    tmpl = Template(f.read())
print(tmpl.render(
    variable = 'Value with <unsafe> data',
    item_list = [1, 2, 3, 4, 5, 6]
))

Le résultat produit :

<!DOCTYPE html>
<html>
  <head>
    <title>Value with &lt;unsafe&gt; data</title>
  </head>
  <body>
    1,
    2,
    3,
    4,
    5,
    6
  </body>
</html>

Notes et références[modifier | modifier le code]

[9],[10],[11],[12]

  1. « Release 3.1.3 », (consulté le )
  2. « Extensions », sur Jinja2 Documentation (2.8-dev) (consulté le )
  3. « Extensions », sur Jinja2 Documentation (2.8-dev) (consulté le )
  4. R. DuPlain, Instant Flask Web Development, Packt Publishing, (ISBN 978-1-78216-963-5, lire en ligne), p. 30
  5. (en) Robert Kimani, « Monitor remote systems with Ansible and Jinja2 templates », sur Red Hat, (consulté le )
  6. « Templating (Jinja2) — Ansible Documentation »
  7. « Welcome | Jinja2 (The Python Template Engine) », sur palletsprojects.com/p/jinja
  8. Armin Ronacher, « Template Designer Documentation », sur Jinja2 Documentation (consulté le ) : « A Jinja template doesn’t need to have a specific extension: .html, .xml, or any other extension is just fine. »
  9. (en) Saeed Mohajeryami, PhD, « Jinja: The Ultimate Tool for Customizable Python Templates », sur bootcamp.uxdesign.cc, (consulté le )
  10. (en) Kaustubh Gupta, « The Ultimate Guide to Master Jinja Template », sur analyticsvidhya.com, (consulté le )
  11. (en) Diva Dugar, « Jinja2 Explained in 5 Minutes! », sur codeburst.io, (consulté le )
  12. (en) Adi Chirilov - Sm0ke, « Jinja Template - Short Introduction and FREE Samples », sur codementor.io, (consulté le )

Liens externes[modifier | modifier le code]