0% ont trouvé ce document utile (0 vote)
26 vues52 pages

Python Avancé : Web et Bases de Données

Ce document présente un cours de programmation web avancée en Python, axé sur la gestion des erreurs, l'importation de modules, l'interaction avec les bases de données et l'utilisation de templates Jinja. Il aborde des concepts tels que la gestion des exceptions en Python, les différents styles de gestion des erreurs, et les étapes nécessaires pour interagir avec une base de données PostgreSQL. Le cours inclut également des exemples pratiques et des références à des bibliothèques et modules pertinents.

Transféré par

chriskotati17
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
26 vues52 pages

Python Avancé : Web et Bases de Données

Ce document présente un cours de programmation web avancée en Python, axé sur la gestion des erreurs, l'importation de modules, l'interaction avec les bases de données et l'utilisation de templates Jinja. Il aborde des concepts tels que la gestion des exceptions en Python, les différents styles de gestion des erreurs, et les étapes nécessaires pour interagir avec une base de données PostgreSQL. Le cours inclut également des exemples pratiques et des références à des bibliothèques et modules pertinents.

Transféré par

chriskotati17
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

BDW - Programmation web - Python avancé

Fabien Duchateau

[Link] [at] [Link]


Université Claude Bernard Lyon 1

2024 - 2025

[Link]
Positionnement dans BDW

Ces diapositives utilisent le genre féminin (e.g., chercheuse, développeuses) plutôt


que l’écriture inclusive (moins accessible, moins concise, et pas totalement inclusive)
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 2 / 51
Rappels

I Syntaxe de Python def ma_fonction(x):


# Retourne la somme de 0 à x
somme = 0
I Opérations et structures if x > 0: # x nombre
de contrôle ,→ positif
for i in range(0, x):
(conditionnelles et print(i)
boucles) somme += i
return somme
I Définition de fonctions

Dans ce cours, système d’import et interaction entre Python et une


base de données PostgreSQL

BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 3 / 51
Plan

Gestion des erreurs

Imports

Bases de données

Templates Jinja
Gestion des erreurs Imports Bases de données Templates Jinja

Motivation

En programmation, deux manières de gérer les erreurs :


I Look Before You Leap (LBYL) = vérifier des conditions avant
d’exécuter une action qui peut échouer
I Easier to Ask Forgiveness than Permission (EAFP) = exécuter
l’action, et gérer en cas d’échec (généralement avec des
exceptions)

En Python, la second option (EAFP) est conseillée (si pertinente)

Voir aussi duck typing et polymorphisme (encouragés par Python)


[Link]
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 5 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Style LBYL

def division(a, b):


if b == 0: # cas exceptionnel
print("Erreur : division par zéro")
return None
return a / b # situation fréquente

Exemple de fonction division (style LBYL)

I Code mettant le focus sur le cas exceptionnel


I Erreur possible malgré une vérification (e.g., existence d’un
fichier vérifié, mais supprimé par un autre programme)
I Problèmes de performance (e.g., une fonction de conversion
en entier vérifie qu’une variable contienne uniquement des
chiffres, puis la transforme en entier, donc re-vérification)

BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 6 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Style EAFP

def division(a, b):


try:
return a / b # situation fréquente
except ZeroDivisionError: # cas exceptionnel
print("Erreur : division par zéro")
return None

Exemple de fonction division (style EAFP)

I Code mettant le focus sur le cas normal (meilleure lisibilité)


I Gestion des cas exceptionnels avec un bloc try … except et
des exceptions typées
I Rares cas où les performances sont moins bonnes qu’en LBYL
(e.g., initialisation d’une clé inexistante dans un dictionnaire)

BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 7 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Syntaxe des exceptions


try:
# instruction(s) pouvant échouer
except TypeError: # type spécifique
# gestion de ce type d'échec
except KeyError: # type spécifique
# gestion de ce type d'échec
# ...
except Exception: # type général
# gestion de ce type d'échec

I Types d’exception prédéfinis (e.g.,


SyntaxError, TypeError,
FileNotFoundError)
I Possible de définir de nouveaux types
I Levée d’une exception avec raise
[Link]
[Link]
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 8 / 51
Plan

Gestion des erreurs

Imports

Bases de données

Templates Jinja
Gestion des erreurs Imports Bases de données Templates Jinja

Définitions

Un module est un fichier Python conte-


nant des définitions (variable, fonction)
I Structuration du code
I Réutilisation de code
I Évite les conflits de nommage

Un package est une collection de mo-


dules
I Installation facilitée
I Partage

BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 10 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Import de module/package

C’est l’instruction import qui permet d’importer un module ou


package
I Généralement les imports sont regroupés en début de fichier
I Deux syntaxes pour importer tout ou partie d’un module
I Pour un module dans un sous-répertoire : sous_rep.module

import module

Import de toutes les définitions du module

from module import définition1, définition2, ...

Import de définitions spécifiques du module

Aussi des options de renommage du (nom de) module, etc. (voir modules)
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 11 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Où trouver des modules/packages ?

Développement de ses propres modules

Python Standard Library (PSL) :


I Les modules de base (e.g., avec la fonction print)
I Des modules optionnels (généralement installés avec la
distribution Python, besoin de les importer pour les utiliser)

Python Package Index (PyPi) :


I Nombreux modules supplémentaires (500k+ en 2024)
I Bien vérifier l’état du module (date de dernière mise à jour,
communauté, etc.)

[Link]
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 12 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Import de ses propres modules


[Link]
x = 1

def sommer(a, b):


return a+b

Définition d’une variable et d’une fonction dans un fichier

[Link] [Link]
import somme from somme import sommer, x

[Link](somme.x, 2) sommer(x, 2)

Import du module, et utilisa- Import de définitions spéci-


tion des définitions en préci- fiques, utilisées directement
sant le nom du module

La notation alternative from somme import * est déconseillée


BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 13 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Import de packages de la PSL

Module random :
import random
I Générateur de
nombres aléatoires x = [Link](0, 10)
print(x) # ex, 7
I Sélection de
[Link]([1, 2, 3, 4]) # ex, 2
valeurs aléatoires
dans une séquence
from datetime import datetime
Module datetime :
I Manipulation de d = [Link]() # objet avec la
date/heure courante
date et heure
,→
[Link]() # ex, 2024-09-01
,→ [Link].971564

[Link]
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 14 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Import de packages de la PSL (2)

Module os :
import os
I Opérations en lien from os import path
avec le système
d’exploitation chemin = '/tmp'

I Répertoires (création, # test si chemin est un rép.


etc.), droits d’accès if [Link](chemin):
rep = 'test' # rép. à créer
I Gestion des processus
chemin_rep = [Link](chemin,
,→ rep) # /tmp/test/
Module [Link] : [Link](chemin_rep) #
,→ création de /tmp/test/
I Manipulation du fichiers = [Link](chemin)
système de fichiers print(f"Liste des fichiers de
(chemins) ,→ {chemin} : {fichiers}")

[Link]
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 15 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Import de packages de la PSL (3)

Module sys : import sys


I Opérations en lien
args = [Link] # arguments
avec l’interpréteur if '-h' in args:
(terminal) print("Affiche les arguments du
I Arguments de la ligne ,→ script")
[Link](0) # quitte (code 0)
de commande else:
I Chemin de recherche for arg in args:
des modules print(arg)

import re

Module re : [Link](r'\s?(BD.*?)\s', 'BDW LC


I Expressions régulières ,→ BDA IHM BDBIO ') # ['BDW',
,→ 'BDA', 'BDBIO']

BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 16 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Import de packages de la PSL (4)

Et beaucoup d’autres...
I shutil, glob, tempfile, request
I math, statistics
I argparse, doctest, unittest, logging
I sqlite3, json, csv, xml

Calvin et Hobbes (Bill Watterson)


BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 17 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Import de packages PyPI

Pour installer un package de Pypi :


I Activer un environnement virtuel !
I Utiliser pip install

# activer un env. virtuel


source .venv/bin/activate
# installer mocodo
python -m pip install mocodo
# lancer mocodo
python -m mocodo

Exemple avec Mocodo (outil de modélisation en base de données)

[Link]
[Link]
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 18 / 51
Plan

Gestion des erreurs

Imports

Bases de données

Templates Jinja
Gestion des erreurs Imports Bases de données Templates Jinja

Généralités

Pour interagir avec les bases de données, Python possède des


modules pour chaque SGBD (e.g., sqlite3 pour SQLite, pymongo
pour MongoDB)

Pour le SGBD PostgreSQL :


I pyscopg : librairie la plus populaire
I pygresql, pyodbc, pg8000, etc.
I Utilisation d’un ORM (Object Relational Mapping)

[Link]
[Link]
[Link]
[Link]
[Link]
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 20 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Généralités

Pour interagir avec les bases de données, Python possède des


modules pour chaque SGBD (e.g., sqlite3 pour SQLite, pymongo
pour MongoDB)

Pour le SGBD PostgreSQL :


I psycopg : librairie la plus populaire
I pygresql, pyodbc, pg8000, etc.
I Utilisation d’un ORM (Object Relational Mapping)

[Link]
[Link]
[Link]
[Link]
[Link]
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 20 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Interaction avec une base de données

Les modules de base de données en Python se conforment à la


PEP 0249 (DB-API), qui spécifie un accès standardisé aux SGBD

Quatre étapes pour interagir avec une base de données :


1. Connexion au SGBD
2. Exécution d’une requête (préparée ou non)
3. Récupération du résultat
4. Fermeture de la connexion

On peut itérer les étapes 2 à 3 autant de fois que l’on veut avant
de fermer la connexion à l’étape 4

[Link]
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 21 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Étape de connexion

Informations de connexion :
I Paramètres : serveur hébergeant le SGBD, nom d’utilisatrice,
mot de passe, nom de la base de données et nom du
(répertoire) schéma
I Ces informations sensibles sont généralement stockées dans un
fichier à part (avec des droits restreints)

SERVER = "[Link]" # adresse serveur


USER = "p1234567" # login
PASSWORD = "remplace42moi" # mot de passe
DATABASE = "p1234567" # nom de la BD
SCHEMA = "tp1" # nom du (répertoire) schéma

[Link]
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 22 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Étape de connexion (2)


Connexion avec [Link]() :
I Retourne un objet connexion qui représente le lien de
connexion vers la base de données choisie
I Une exception est levée si la connexion n’aboutit pas

1 import psycopg
2
3 def get_connexion(host, username, password, db, schema):
4 try:
5 connexion = [Link](host=host, user=username,
,→ password=password, dbname=db, autocommit=True)
6 # on sélectionne le schéma par une requête SET
7 cursor = [Link](connexion)
8 [Link]("SET search_path TO %s", [schema])
9 except Exception as e:
10 print(e)
11 return None
12 return connexion
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 23 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Étape d’exécution
Curseur : objet qui permet d’exécuter une (ou plusieurs) requête et
de récupérer le résultat sous forme d’un objet Python (liste de
tuples ou de dictionnaires)

curseur = [Link]()

Création d’un curseur à partir d’un objet connexion et de la


méthode cursor()

[Link]("SELECT nomSerie FROM Series")

Exécution d’une requête SQL (simple) à partir du curseur et de la


méthode execute()

[Link]
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 24 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Étape d’exécution - exemple de requête simple

1 def get_series(connexion):
2 try:
3 cursor = [Link]()
4 [Link]("SELECT * FROM Actrices")
5 return cursor # liste de tuples
6 except [Link] as e:
7 print(f"Error : {e}")
8 return None

Résultat (sous forme d’une liste de tuples) :


[ (111, 'Bean', 'Sean'),
(222, 'Fairley', 'Michelle'),
(333, 'Cuoco', 'Kaley'),
(444, 'Parsons', 'Jims'),
(555, 'Avgeropoulos', 'Marie'), ]

BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 25 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Étape d’exécution - exemple de requête simple (2)


1 from [Link] import dict_row
2
3 def get_series_as_dict(connexion):
4 try:
5 cursor = [Link]()
6 cursor.row_factory = dict_row # ligne importante
7 [Link]("SELECT * FROM Actrices")
8 return cursor # liste de dict
9 except [Link] as e:
10 print(f"Error : {e}")
11 return None

Résultat (sous forme d’une liste de dictionnaires) :


[ {'numINSEE': 111, 'nom': 'Bean', 'prenom': 'Sean'},
{'numINSEE': 222, 'nom': 'Fairley', 'prenom': 'Michelle'},
{'numINSEE': 333, 'nom': 'Cuoco', 'prenom': 'Kaley'},
... ]
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 26 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Étape d’exécution - exemple de requête avec variable

1 def get_episodes(connexion, num_episode):


2 try:
3 cursor = [Link]()
4 [Link]("SELECT * FROM Episodes WHERE
,→ numéro=%s", [num_episode])
5 return cursor
6 except [Link] as e:
7 print(f"Error : {e}")
8 return None

Cette fonction nécessite un paramètre num_episode afin d’afficher


tous les épisodes avec ce numéro. Pour construire la requête, on ne
doit pas concaténer la variable au SQL, mais utiliser le second
paramètre de la méthode execute() : une liste de variables dont
les valeurs remplacent (respectivement) les %s du SQL
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 27 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Précisions sur le curseur

I Contient différentes informations (état, description, nombre


d’instances récupérées ou modifiées, etc.) et des méthodes
(execute(), executemany(), fetchone(), etc.)

I Est un objet itérable (accès aux instances résultat)

I Quand on lit les instances (résultat d’une requête) d’un


curseur, pas possible de relire les résultats précédents

I Les requêtes dynamiques (i.e., avec un nom d’identifiant SQL


représenté par une variable, e.g., un nom de table ou
d’attribut) ont une syntaxe spéciale (sécurité)

[Link]
[Link]
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 28 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Étape d’exécution - exemple de requête dynamique

1 from psycopg import sql


2
3 def get_instances(connexion, nom_table):
4 try:
5 cursor = [Link]()
6 query = [Link]('SELECT * FROM
,→ {table}').format(table=[Link](nom_table), )
7 [Link](query)
8 return cursor
9 except [Link] as e:
10 print(f"Error : {e}")
11 return None

Pour afficher les instances d’une table quelconque (paramètre


nom_table), on construit la requête avec [Link]() et
[Link] permet d’ associer le nom de la table dans la
requête SQL au paramètre nom_table
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 29 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Étape de récupération du résultat

Comment récupérer le résultat selon le type de requête ?

I Requête de type select : le résultat est sous forme


d’instances ⇒ méthodes fetchone(), fetchmany(),
fetchall() du curseur

I Autres types de requête : le résultat est un nombre d’instances


(affectées, e.g., nombre d’instances créées, mises à jour ou
supprimées) ⇒ attribut rowcount du curseur

Les méthodes fetch...() retournent une liste contenant soit des tuples,
soit des dictionnaires (selon cursor.row_factory)
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 30 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Étape de récupération du résultat - exemples

I Lecture du nombre d’instances affectées (attribut rowcount


du curseur) dans le cas d’une requête autre que select
[Link]("UPDATE Actrices SET salaire=1000")
nb_maj = [Link] # integer

I Lecture d’une seule instance en utilisant la méthode


fetchone() du curseur
[Link]("SELECT count(*) FROM Actrices")
nb_actrices = [Link]()[0] # 1 tuple avec 1 élement

BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 31 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Étape de récupération du résultat - exemples (2)

I Lecture de chaque instance en itérant sur le curseur


[Link]("SELECT * FROM Actrices")
for instance in cursor:
print(instance) # tuple avec zéro ou plusieurs éléments

I Lecture de chaque instance en utilisant la méthode


fetchall() du curseur
[Link]("SELECT * FROM Actrices")
actrices = [Link]()
for instance in actrices:
print(instance) # tuple avec zéro ou plusieurs éléments

Afin de séparer les différentes parties du code, il est conseillé que les
fonctions d’accès aux données retournent une liste Python (avec fetchall()).
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 32 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Requêtes préparées

Une requête préparée (ou requête paramétrable) est une requête


récurrente, que l’on compile avec des variables, et donc réutilisable
en fournissant les valeurs manquantes (visibilité limitée à la session
du SGBD)

Avantages d’une requête préparée :


I Performances (la requête est déjà compilée, cf optimisation)
I Économiser de la bande passante
I Éviter les risques d’injection SQL pour certains systèmes
(paramètres transmis sous forme binaire)

BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 33 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Éxécution d’une requête préparée

def get_episodes(connexion, num_episode):


try:
cursor = [Link]()
[Link]("SELECT * FROM Episodes WHERE
,→ numéro=%s", [num_episode], prepare=True)
return cursor
except [Link] as e:
print(f"Error : {e}")
return None

Le paramètre prepare=True de la méthode execute() indique de


préparer la requête (plan calculé et stocké par PostgreSQL).

BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 34 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Étape de déconnexion

I Conseillé de fermer la connexion en fin de session (si non fait


automatiquement, e.g., par un context manager )
I Méthode close sur l’objet connexion

def disconnect(connection):
[Link]()
return True

BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 35 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

En résumé

I Différents packages pour PostgreSQL, dont psycopg


I Quatre étapes pour se connecter et exécuter des requêtes

Exemple de page dynamique utilisant l’extension psycopg

BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 36 / 51
Plan

Gestion des erreurs

Imports

Bases de données

Templates Jinja
Gestion des erreurs Imports Bases de données Templates Jinja

Les templates

Un template (gabarit) est un modèle dans un langage (e.g., HTML,


Latex) qui inclut des instructions particulières (e.g., conditionnelle,
affichage de variable) interprétées par le moteur de templates

I Factorisation et réutilisation du code (DRY)


I Code lisible par les humains
I Séparation des différentes parties du code

En programmation web, un template est un fichier HTML avec des


variables et des expressions

[Link]
[Link]
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 38 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Moteur de templates

Des dizaines de moteurs de templates pour Python...


I Exemple avec Mustache/Chevron (limité à de la substitution)
1 import chevron
2
3 [Link]('<h1>{{ titre }}</h1>',
4 {'titre': 'Hello world !'}) # <h1>Hello world !</h1>

I Exemple avec Jinja


1 from [Link] import NativeEnvironment
2
3 env = NativeEnvironment() # environnement jinja basique
4 template = env.from_string('<h1>{{ titre }}</h1>')
5 result = [Link](titre='Hello world !')
6 print(result) # <h1>Hello world !</h1>

BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 39 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Package Jinja

Un moteur de templates couplé à Python :


I Substitution de variables et traitements plus complexes
I Système d’héritage entre templates
I …

Avec le serveur web fourni, fonctionnement simplifié (transparent) :


I Pas besoin de gérer les environnements
I Pas besoin de passer des variables aux templates
I Concentration sur l’écriture des templates

[Link]
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 40 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Syntaxe générale

Un template HTML Jinja peut contenir :


I Du code HTML (!)

I Des instructions de substitution de variables


<div class="error">{{ message }}</div>

I Des instructions avancées (structures de contrôle)


{% if True %}
<span>vrai</span>
{% endif %}

I Des commentaires Jinja


{# voici un commentaire #}

BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 41 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Substitution de variables

I Délimiteurs {{…}} pour remplacer une variable par sa valeur


I Notation avec crochets ou notation pointée pour accéder aux
éléments d’une structure

hello = 'Hello world' # variable définie en python


mon_dict = {'a': 1, 'b': 2} # variable définie en python

Variables déclarées dans un fichier Python et passées au template

<div>{{ hello }}</div>


<div>{{ mon_dict['a'] }}</div>
<div>{{ mon_dict.b }}</div>

Fichier template avec du code HTML et des variables substituées

BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 42 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Filtres
Jinja fournit un certain nombre de filtres
I Symbole | pour appliquer un filtre à une variable

ma_liste = list(1, 2, 3, 4, 5) # variable définie en python

Variable déclarée dans un fichier Python et passée au template

{# nombre d'éléments dans une séquence #}


<div>{{ ma_liste | length }}</div>

{# remplacement dans une chaine de caractères #}


<div>{{ "Hello World" | replace("Hello", "Bye Bye") }}</div>

Fichier template avec du code HTML et des filtres


Dans la majorité des cas, mieux vaut transformer les données soit
en SQL soit en Python au lieu d’utiliser ces filtres
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 43 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Test conditionnel

I Permet l’affichage d’un bloc de code HTML selon une


condition
I Syntaxe du if similaire à Python (elif et else optionnels)
I Expressions (e.g., ==, !=, and, or, not, in)

1 {% if a_gagne %}
2 <span class="success">Bravo !</span>
3 {% else %}
4 <span class="info">Prochain tour.</span>
5 {% endif %}

Affichage d’un message selon la valeur de la variable a_gagne : des


félicitations (avec classe success) ou le prochain tour
[Link]
[Link]
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 44 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Boucle

I Permet de répéter un bloc de code HTML (e.g., pour


construire dynamiquement le contenu d’un tableau, d’une liste
déroulante ou d’une liste ordonnée)
I Syntaxe du for similaire à Python

1 <ul> <ul>
2 {% for valeur in ma_liste %} <li>1</li>
3 <li>{{ valeur }}</li> <li>2</li>
4 {% endfor %} <li>3</li>
5 </ul> <li>4</li>
<li>5</li>
Template avec boucle pour construire </ul>
une liste non ordonnée (<ul>) dont les
éléments (<li>) proviennent d’une liste Code HTML généré

BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 45 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Boucle (2)
mon_dict = {'BDW': 'Base de données et programmation web',
'BDA': 'Base de données avancées'}

Variable déclarée dans un fichier Python et passée au template

1 <dl> <dl>
2 {% for cle, val in mon_dict %} <dt>BDW</dt>
3 <dt>{{ cle }}</dt> <dd>Base de données et
4 <dd>{{ val }}</dd> ,→ programmation web</dd>
5 {% endfor %} <dt>BDA</dt>
6 </dl> <dd>Base de données
,→ avancées</dd>
Template avec boucle pour </dl>
construire une liste de description
Code HTML généré
(<dl>) dont le contenu (<dt> et
<dd>) provient d’un dictionnaire

BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 46 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Includes

I Jinja permet d’inclure un fichier template depuis un autre


(équivalent à un copier-coller du premier dans le second)

[Link] [Link]
1 {% include '[Link]' %} <header>
2 <main> <img src="[Link]">
3 <h1>Ma page</h1> <h1>Nom du site</h1>
4 <p>blah blah</p> </header>
5 </main>
6 {% include '[Link]' %} Fichier contenant le code
Template principal qui inclut l’entête du <header>
et le pied de page

Utilisé pour factoriser les parties statiques d’un site (code identique
quelle que soit la page, e.g., entête, pied de page)

BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 47 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Héritage

Dans Jinja, un template peut hériter d’un autre template :


I Le template parent définit des blocs nommés
(éventuellement sans contenu)
I Les templates enfants étendent un template parent
I Les templates enfants peuvent redéfinir un contenu pour les
blocs nommés

Utilisé pour avoir un agencement et un design cohérents sur toutes


les pages du site, sans redondance de code :
I Le template parent définit l’agencement général (commun)
I Un template enfant définit le contenu spécifique d’une page

[Link]
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 48 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

Héritage (2)
[Link] [Link]
1 <!doctype html> {% extends "[Link]" %}
2 <html> héritage
3 <head> {% block main %}
4 <meta charset="utf-8" /> <h2>Affichage</h2>
5 <link type="text/css" <table>

u
ten
,→ href="[Link]"> ...

con
6 <title>Mon super site</title> </table>

u
7 </head> {% endblock %}

nd
itio
8
Template enfant afficher

éfin
9 <body>

red
10 {% include '[Link]' %}
11 <main> [Link]
12 {% block main %}{% endblock %} ide {% extends "[Link]" %}
m
13 </main>
14 {% include '[Link]' %} {% block main %}
15 </body> <h2>Ajout</h2>
16 </html> <form>
...
Template de base, avec un bloc nom- </form>
{% endblock %}
mé main vide et qui sera redéfini par
les templates enfants Template enfant ajouter
BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 49 / 51
Gestion des erreurs Imports Bases de données Templates Jinja

En résumé

I Filtres et méthodes de test (e.g., is false, is string)

I Assignation de variables (set), contrôle fin sur les structure


de contrôle, etc.

I Définition de macros (macro), héritage avancé

I Gestion de l’échappement, gestionnaire de contexte,


internationalisation, etc.

Comment gérer et répartir le code entre les modules Python, les


accès base de données et les templates HTML ?

BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 50 / 51
Bilan

I Gestion des erreurs (try … except)


I Utilisation de packages (import)
I Interaction avec une BD PostgreSQL (psycopg)
I Système de templates pour HTML (jinja)

Prochain cours :
structuration d’un site web
avec l’architecture MVC

BDW - Base de données et programmation web // Programmation web - Python avancé UCBL Lyon 1 51 / 51

Vous aimerez peut-être aussi