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/
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 %}