03 Jinja
Jinja
Jinja est un moteur de template écrit en Python par l'équipe de Flask. Sa simplicité, son élégance et sa puissance en font l'un des meilleurs moteur de template existant. Le moteur de template Twig utiliser massivement dans le monde PHP en est une pâle traduction.
Moteur de template
Générer du code HTML via Python n'est pas fun voir fastidieux, car vous devez vous-même échapper le code HTML pour que l'application soit sécurisée. Flask nous propose automatiquement d'utiliser le moteur de template Jinja.
Jinja & Flask
Pour rendre un template, vous pouvez utiliser la méthode render_template()
. Tout ce que vous avez à faire est de fournir le nom du template et les variables que vous souhaitez transmettre au moteur de template sous forme d'arguments.
Voici un exemple simple de rendu d’un template:
from flask import render_template
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
return render_template('hello.html', name=name)
Flask va chercher automatiquement le template dans le dossier templates
qui se trouve à la racine du projet. Pensez à lire la documentation de Jinja pour découvrir sa puissance.
Voici un exemple de template:
<!DOCTYPE html>
<title>Hello from Flask</title>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello, World!</h1>
{% endif %}
À vous de jouer
- Écrivez le test d'intégrations pour la route hello,
- Modifiez la route
hello
pour rendre le templatehello.html
, - Créez un template pour les routes index, say_hello et pour les opérations arithmétiques (il est possible d'utiliser la même pour ces routes-ci).
Héritage de template
La partie la plus puissante de Jinja est l’héritage des templates. L'héritage de templates vous permet de créer un «squelette» de base contenant tous les éléments communs de votre site et définir des blocs que les modèles enfants peuvent remplacer.
Cela semble compliqué mais reste très basique. Il est plus facile de comprendre cela en commençant par un exemple.
Ce template, que nous appellerons base.html, définit un simple squelette de document HTML. C’est le travail des templates «enfants» de remplir les blocs vides de contenu:
<!DOCTYPE html>
<html lang="en">
<head>
<title>{% block title %}{% endblock %} - My Webpage</title>
</head>
<body>
<main>{% block content %}{% endblock %}</main>
<footer>
{% block footer %}
© Copyright 2008 by <a href="http://domain.invalid/">you</a>.
{% endblock %}
</footer>
</body>
</html>
Dans cet exemple, les balises {% block %}
définissent trois blocs que les modèles enfants peuvent remplir.
La balise de bloc indique simplement au moteur de template qu'un modèle enfant peut remplacer les espaces réservés qu'il contient.
Un modèle enfant pourrait ressembler à ceci:
{% extends "base.html" %}
{% block title %}Index{% endblock %}
{% block content %}
<h1>Index</h1>
<p class="important">
Welcome to my awesome homepage.
</p>
{% endblock %}
La balise {% extend %}
est la clé ici. Il indique au moteur de modèle que ce modèle «étend» un autre modèle. Lorsque le système de gabarit évalue ce gabarit, il localise d'abord le parent. La balise extend devrait être la première balise du modèle.
À vous de jouer
- Créer un template de base,
- Faites en hériter chacun de vos templates.
URL
URL et redirection
Pour créer une URL vers une fonction spécifique, utilisez la fonction url_for()
.
Elle accepte le nom de la fonction en tant que premier argument et un nombre quelconque d'arguments, chacun correspondant à une partie variable de la règle d'URL. Des parties variables inconnues sont ajoutées à l'URL en tant que paramètres de requête.
Pourquoi créer des URL en utilisant la fonction d'inversion d'URL url_for()
au lieu de les coder en dur dans vos templates ?
- L'inversion est souvent plus descriptive que le codage en dur des URL.
- Vous pouvez modifier vos URL en une seule fois au lieu de vous rappeler de modifier manuellement les URL codées en dur.
- La création d'URL gère l'échappement des caractères spéciaux et des données Unicode de manière transparente.
- Les chemins générés sont toujours absolus, évitant un comportement inattendu des chemins relatifs dans les navigateurs.
Voici un exemple de génération d'url:
<a href="{{ url_for('say_hello', name='Ben') }}">Hello Ben ?</a>
Fichier statique
Un site web sans feuille de style est assez pauvre, il convient donc d'utiliser des fichiers statiques pour le mettre en forme.
Même si il s'agit du boulot du serveur HTTP, Flask s'occupe de générer l'url vers les fichiers statiques.
Il faut tout d'abord créer un répertoire static
à la racine du projet. Pour générer les URL des fichier statiques, il faut utiliser la fonction url_for()
avec le endpoint static
. Par exemple:
<link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='style.css') }}" />
À vous de jouer
- Créer un menu de navigation avec un lien pour la page d'accueil et la page hello,
- Au sein de la page d'accueil créer des liens vers chaque page que nous avons créer (say_hello, opérations arithmétiques, etc.)
- Ajouter normalize.css et un fichier de style CSS à votre projet.
Félications ! Nous venons de découvrir les bases du microframework Flask ensemble.