Jinja2

jinja est un module python permettant de produire rapidement du texte dynamique.

L’idée principale est de fournir à un module:

  • un template
  • une liste de valeur

jinja fournit des outils pour réaliser des templates avec boucle et condition.

On retrouve jinja2 sur cete url http://jinja.pocoo.org/

On retrouve la doc de l’Api sur cet url http://jinja.pocoo.org/docs/

Installation

rien de plus simple avec easy_install (pipi)

easy_install jinja2

Exemple d’utilisation

from jinja2 import Template
template = Template('Hello {{ name }}!')
rst = template.render(name='John Doe')
print rst

un exmple avec des boucles, des if et des fonctions

from jinja2 import Template
template = Template("""
{% if users %}
<h1>Members</h1>
<ul>
{% for user in users %}
  <li>{{ user['username'] }}  {{ user['name'] }}</li>
{% endfor %}
</ul>
{{ users|length }} Members
{% else %}
<h1>Not Members</h1>
{% endif %}""")

lst_users=[
        {'username':'username1', 'name':'name1'},
        {'username':'username2', 'name':'name2'},
        {'username':'username3', 'name':'name3'}
]

rst = template.render(users=lst_users)
print rst

le résultat

<h1>Members</h1>
<ul>

  <li>username1  name1</li>

  <li>username2  name2</li>

  <li>username3  name3</li>

</ul>
3 Members

un autre exemple avec une connexion à une base

import MySQLdb
from MySQLdb.cursors import DictCursor
import jinja2
env = jinja2.Environment(loader=jinja2.FileSystemLoader(["/home/beda/projects/python-ref/_tmp/infiles"])) #@+

def index():
  connection = MySQLdb.connect( user="test", passwd="pass123", db="world", host="localhost", cursorclass=DictCursor, use_unicode=True)
  cursor1 = connection.cursor()

  cursor1.execute( "SELECT Name,Population FROM Country ORDER BY Name;")
  countries = cursor1.fetchall()
  cursor1.close()
  connection.close()

  template = env.get_template( "page_template2_syntax.html")
  return template.render( title="Country list", countries=countries)

le template (avec des extends)

{% extends 'page_template2.html' %}

{% block title %}Syntax{% endblock %}

{% block subtitle %}Examples of Jinja syntax{% endblock %}

{% block content %}
<table>  {# comment #}
{% for country in countries %}
  {%- if country.Population > 100000000 -%} {#- dictionary access similar to attribute access -#}
  <tr style="background-color: red">
  {%- elif country.Population > 10000000 -%} {#- - after % or # removes extra newlines -#}
  <tr style="background-color: pink">
  {%- else -%}
  <tr>
  {%- endif -%}
  <td>{{ country['Name'] }}</td><td style="text-align: right">{{ country['Population'] }}</td></tr>
  {% if loop.index % 10 == 0 %} {#- loop is a special variable -#}
  <tr style="background-color:black"><td colspan="3" style="text-align: center; color: white">{{ loop.index }}</td></tr>
  {% endif %}
{% endfor %}
</table>
{% endblock %}