Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| dev:python:flask:templates [2024/11/19 11:41] – yoann | dev:python:flask:templates [2026/04/10 06:09] (Version actuelle) – yoann | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | {{tag> | + | {{tag> |
| - | : | ||
| ====== Flask : Utilisation des templates ====== | ====== Flask : Utilisation des templates ====== | ||
| - | Le template est un document HTML contenant des zones non remplies (placeholders). | + | ===== Généralités ===== |
| - | Héritage : Le document de base contient | + | Grossièrement, |
| - | | + | **Flask** s' |
| - | ===== Le helper url_for() ===== | + | * '' |
| + | * '' | ||
| + | * '' | ||
| - | Depuis le template on peut utiliser la fonction **'' | ||
| - | Dans notre projet Flask, on a une fonction nommée par exemple '' | + | |
| + | <code html [highlight_lines_extra=" | ||
| + | < | ||
| + | <html lang=" | ||
| + | < | ||
| + | <meta charset=" | ||
| + | < | ||
| + | </ | ||
| + | < | ||
| + | {# Affiche le contenu de la variable msg comme titre #} | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Rendu du template ===== | ||
| + | |||
| + | Pour pouvoir générer la partie dynamique du template via le framework Flask, on utilise la fonction helper '' | ||
| + | |||
| + | < | ||
| + | Par défaut, le framework Flask est paramétré pour rechercher les templates dans le sous-dossier '' | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | from flask import Flask, render_template | ||
| + | |||
| + | # ... | ||
| + | |||
| + | @app.route('/' | ||
| + | def supply_index() -> str: | ||
| + | msg = "Hello World !!!" | ||
| + | return render_template(' | ||
| + | |||
| + | </ | ||
| + | |||
| + | < | ||
| + | Flash utilise la notion de routes pour associer une ou plusieurs URL à une fonction Python en charge de produire une vue, un résultat exploitable par le client (une page web). confère [[dev: | ||
| + | </ | ||
| + | |||
| + | ===== Objets accessibles depuis le template ===== | ||
| + | |||
| + | A l' | ||
| + | * **config** ; | ||
| + | * **request** ; | ||
| + | * **session** ; | ||
| + | * **g** (variables globales). | ||
| + | |||
| + | Les fonctions **url_for()** et **get_flashed_messages()** sont également disponibles. | ||
| + | |||
| + | |||
| + | |||
| + | ===== La fonction helper url_for() ===== | ||
| + | |||
| + | |||
| + | Si les liens vers les autres pages sont définis en dur dans les templates, ils deviendront invalides lorsque les routes de l' | ||
| + | |||
| + | C'est pourquoi il est recommandé d' | ||
| + | |||
| + | L' | ||
| + | |||
| + | |||
| + | Dans notre projet Flask, on a une fonction nommée par exemple '' | ||
| <code python> | <code python> | ||
| @app.route('/ | @app.route('/ | ||
| - | def new_universe(): | + | def create_universe(): |
| if request.method == ' | if request.method == ' | ||
| ... | ... | ||
| Ligne 29: | Ligne 92: | ||
| <code html> | <code html> | ||
| ... | ... | ||
| - | <a href=" | + | <a href=" |
| ... | ... | ||
| + | </ | ||
| + | |||
| + | ===== Héritage ===== | ||
| + | |||
| + | La notion d' | ||
| + | * On définit un template parent contenant des **placeholders** ; | ||
| + | * Chaque enfant héritant du document parent devra définit le contenu des **placeholders** ; | ||
| + | |||
| + | |||
| + | * En général on définit un document '' | ||
| + | * Chaque enfant complète les placeholders pour produire la réponse (la page web complète à retourner au client). | ||
| + | |||
| + | |||
| + | Un exemple de document parent avec en surbrillance la définition des placeholders : | ||
| + | |||
| + | <code html base.html [highlight_lines_extra=" | ||
| + | < | ||
| + | <html lang=" | ||
| + | < | ||
| + | <meta charset=" | ||
| + | < | ||
| + | <meta name=" | ||
| + | <meta name=" | ||
| + | <link rel=" | ||
| + | <link rel=" | ||
| + | <link rel=" | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | <nav> | ||
| + | <!-- barre de navigation --> | ||
| + | <a href="#"> | ||
| + | <a href="#"> | ||
| + | <a href="#"> | ||
| + | </ | ||
| + | <div class=" | ||
| + | {% block content %}{% endblock %} | ||
| + | </ | ||
| + | < | ||
| + | <!-- contenu statique du pied de page --> | ||
| + | </ | ||
| + | <script src=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Un exemple de document enfant : | ||
| + | |||
| + | <code html index.html [highlight_lines_extra=" | ||
| + | {% extends ' | ||
| + | {# | ||
| + | Hérite du template " | ||
| + | doit redéfinir les placeholders : " | ||
| + | #} | ||
| + | |||
| + | {% block content %} | ||
| + | < | ||
| + | <!-- section messages flash --> | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | <p>{{ msg }}</ | ||
| + | </ | ||
| + | < | ||
| + | <!-- section status --> | ||
| + | </ | ||
| + | {% endblock %} | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | Dans le template enfant, le block " | ||
| + | </ | ||
| + | |||
| + | La [[# | ||
| + | |||
| + | ===== Boucles et conditions ===== | ||
| + | |||
| + | Le moteur de template supporte la boucle '' | ||
| + | |||
| + | <code html [highlight_lines_extra=" | ||
| + | {% extends ' | ||
| + | {# | ||
| + | Hérite du template " | ||
| + | doit redéfinir les placeholders : title et content | ||
| + | #} | ||
| + | |||
| + | {% block content %} | ||
| + | < | ||
| + | <!-- section messages flash --> | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | <p>{{ msg }}</ | ||
| + | <!-- Affiche tous les commentaires --> | ||
| + | <div style=" | ||
| + | {% for comment in comments %} | ||
| + | <div style=" | ||
| + | <p style=" | ||
| + | </ | ||
| + | {% endfor %} | ||
| + | </ | ||
| + | < | ||
| + | <!-- section status --> | ||
| + | </ | ||
| + | {% endblock %} | ||
| + | </ | ||
| + | |||
| + | La variable comments devra être fournie par la vue au template : | ||
| + | |||
| + | <code python> | ||
| + | @app.route('/' | ||
| + | @app.route('/ | ||
| + | def supply_index() -> str: | ||
| + | msg = "Hello World !!!" | ||
| + | comments = [ | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ] | ||
| + | return render_template(' | ||
| + | </ | ||
| + | |||
| + | |||
| + | La structure conditionnelle '' | ||
| + | <code html [highlight_lines_extra=" | ||
| + | {% extends ' | ||
| + | {# | ||
| + | Hérite du template " | ||
| + | doit redéfinir les placeholders : title et content | ||
| + | #} | ||
| + | |||
| + | {% block content %} | ||
| + | < | ||
| + | <!-- section messages flash --> | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | <p>{{ msg }}</ | ||
| + | <!-- Affiche tous les commentaires --> | ||
| + | <div style=" | ||
| + | {% for comment in comments %} | ||
| + | {% if loop.index % 2 == 0 %} | ||
| + | {% set bg_color = '# | ||
| + | {% else %} | ||
| + | {% set bg_color = '# | ||
| + | {% endif %} | ||
| + | <div style=" | ||
| + | <p style=" | ||
| + | </ | ||
| + | {% endfor %} | ||
| + | </ | ||
| + | < | ||
| + | <!-- section status --> | ||
| + | </ | ||
| + | {% endblock %} | ||
| + | </ | ||
| + | |||
| + | ===== Filtres Jinja2 ===== | ||
| + | |||
| + | Les filtres Jinja permettent d' | ||
| + | |||
| + | <code html> | ||
| + | <div style=" | ||
| + | <!-- Affiche le commentaire en majuscules --> | ||
| + | <p style=" | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Le filtre '' | ||
| + | |||
| + | <code html> | ||
| + | {# Ici les balises sont échappées par le moteur Jinja : elles seront affichées comme du texte #} | ||
| + | {{ "< | ||
| + | |||
| + | {# le filtre safe permet d' | ||
| + | {{ "< | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | Les valeurs saisies ou retournées par l' | ||
| + | </ | ||
| + | |||
| + | ===== Formater la date dans le template ===== | ||
| + | |||
| + | Le plus simple est d' | ||
| + | |||
| + | <code html> | ||
| + | <div> | ||
| + | < | ||
| + | </ | ||
| </ | </ | ||
| ===== Références ===== | ===== Références ===== | ||
| - | * https:// | + | * [[https:// |
| + | * [[https:// | ||