UE5 : Fondamentaux du développement web frontal, niveau 2

Séance 2 : Routes et templates

  1. Les décorateurs Python: rappels
    1. Les décorateurs sans paramètres
    2. Les décorateurs avec paramètres
  2. Une première route
  3. Une route GET avec paramètres

Les décorateurs Python: rappels

Décorateurs sans paramètres

Un décorateur est une fonction qui modifie le comportement d'autres fonctions. Ils sont utilisés quand on veut ajouter du code identique à plusieurs fonctions.

Créons un décorateur qui se comporte comme un gestionnaire d'accès, en autorisant ou non quelqu'un à accéder à une page Web par exemple.

utilisateur = "admin"
# création du décorateur
def acces(fonction):

    # fonction qui sera jouée pour tous les utilisateurs fournis
    def resultat():
        print("L'accès n'est pas possible")
    
    if utilisateur != "admin":
        return resultat
    
    # ne pas oublier de retourner la fonction modifiée
    return fonction  
# je créé une fonction décorée, check_acces
@acces
def check_acces():
    print("J'ai bien accès")

# j'appele cette fonction décorée, avec la variable utilisateur qui est toujours à admin
check_acces()
# si on change utilisateur, la fonction par défaut est lancée dans le décorateur
utilisateur = "not_admin"

@acces
def check_acces():
    print("J'ai bien accès")
check_acces()

Décorateurs avec paramètres

Le décorateur peut accepter les paramètres de la fonction initiale.

def acces(fonction):
    def resultat(*params):
        print("L'accès n'est pas possible pour " + params[0])
    
    if utilisateur != "admin":
        return resultat
    
    return fonction  
utilisateur = "not_admin"

@acces
def check_acces(utilisateur):
    print("J'ai bien accès en tant que " + utilisateur)
check_acces(utilisateur)

utilisateur = "admin"

@acces
def check_acces(utilisateur):
    print("J'ai bien accès en tant que " + utilisateur)
check_acces(utilisateur)

Une première route

Dans Flask, une route est une vue d'une URL, elle conduit à l'exécution d'une fonction Python. Elles sont déclarées via un décorateur app.route().

Puisque app (notre instance de Flask) est appelée, il faut donc que la défintion des routes intervienne après l'instanciation de Flask dans notre package.

Commençons simplement en reprenant le squelette de l'application Flask et en modifiant le fichier app.py en ajoutant à la fin le contenu suivant.

# app/app.py

@app.route("/")
@app.route("/home")
def home():
    return "Hello world!"

Attention, ce que le navigateur affiche n'est pas du HTML, seulement notre chaîne de caractère.

Il est maintenant temps d'observer nos premiers logs HTTP (qu'il convient de savoir lire afin de débugger l'application). Chaque fois qu'un appel HTTP est effectué sur le serveur, une ligne est renvoyée au minimum, décrivant la ressource demandée et le statut de la réponse.

127.0.0.1 - - [23/Oct/2022 14:06:37] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [23/Oct/2022 14:21:40] "GET /home HTTP/1.1" 200 -

Une route GET avec paramètres

De très nombreuses pages Web ont des identifiants à la fin des URL. Ces derniers permettent de générer des pages à la volée à partir de données stockées autre part que dans l'application. Les développeurs du site n'ont ainsi pas à créer des milliers voire des millions de pages identiques où seule la donnée change.

Sur Wikidata, les identifiants sont bien à la fin et commencent par Q: https://www.wikidata.org/wiki/Q142.

Avec Flask, il est possible de créer des URL avec des paramètres à la fin.

# app/app.py

@app.route("/home/<string:id>")
def home(id:str):
    return "Hello world! On a demandé l'identifiant " + id
type exemple
string application
int 3
float 1.23
any n'importe quoi
uuid 123e4567-e89b-12d3-a456-426614174000
path /chemin/vers/ressource