Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site
Flask est un micro framework open-source de développement web en Python.
Flask a été créé initialement par Armin Ronacher en 2010. Le souhait de son créateur était de réaliser un framework web Python
très simple d'emploi. En 2018, Flask a été élu "Framework web le plus populaire".
Flask est une bibliothèque Python. Donc pour le télécharger sur votre PC il suffit d'utiliser l'utilitaire PIP.
À partir du shell windows tapez la commande pip install flask
Créez un nouveau dossier à la racine de C: et nommez le python_flask.
Créez dans ce dossier un fichier nommé application.py qui doit contenir le code ci-dessous.
Ce fichier est bien sûr enregistré dans "c:\python_flask".
J'ai importé la fonction "Flask" du module "flask" . Attention : un F majuscule pour la fonction & un f minuscule pour le module).
L'application se nomme "app".
La route '/' correspond à la page d'accueil de votre application.
Donc si on se trouve à la racine, Flask va déclencher l'exécution de la fonction "bonjour" qui se contente d'afficher le message
"Bienvenue sur Flask" avec un certain style (grâce au balisage H2) dans le navigateur.
Le dernier bloc est très important ; c'est ce code qui crée le serveur web local sur le port 5000 (par défaut).
À partir de l'explorateur de fichiers double-cliquez sur le fichier "application.py".
Le shell de windows affiche :
* Serving Flask app "application" (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
Le terminal vous informe que le serveur web local "tourne" sur le port 5000. Et que vous devez donc taper en guise d'url : http://127.0.0.1:5000 ou plus simplement : localhost:5000
Le serveur web local étant actif, j'ouvre le navigateur (Chrome ou Firefox) ; je saisis dans la barre d'URL du navigateur
localhost:5000
Le message "Bienvenue sur Flask" est alors affiché dans la fenêtre du navigateur.
L'inconvénient du script actuel est que l'on mélange du Python et du HTML avec une instruction barbare :
return "<h2>Bienvenue sur Flask !</h2>"
Je parle d'instruction "barbare" car il y a un mélange de Python et de HTML dans cette instruction.
Pour éviter cette inconvénient déjà rencontré avec la technologie CGI, nous allons recourir aux templates.
Un template est un modèle qui génère du code HTML. Il s'agit d'un fichier qui a pour extension .htm.
À la différence d'un document HTML standard, un template peut contenir : des variables, des tests, des boucles.
Ces instructions seront traduites en HTML standard grâce au "moteur de templates".
Flask utilise le moteur de template Jinja.
Dans le répertoire "c:\python_flask" creéz un dossier "templates" (avec un s final).
Dans ce dossier creéz un fichier "index.htm" dont le contenu est indiqué ci-dessous.
Le code du template "index.htm" :
Et oui, c'est une page web standard.
Nous devons modifier le code de la fonction "bonjour()" dans la route ('/')
from flask import Flask, render_template ... @app.route('/') def bonjour(): return render_template("index.htm") ...
La fonction "bonjour()" ne contient désormais que du code Python. Je respecte donc l'esprit MVT.
C'est plus joli comme affichage.
Si vous voulez que le texte soit centré horizontalement, il suffit de rajouter dans la règle de style relative à H2 : text-align: center.
Oui, le développement web en Python-Flask suppose de maitriser les langages du web : HTML,CSS voire JavaScript.
Pour l'instant notre application est statique : affichage de toujours le même message.
Je vais maintenant créer une deuxième route dans le script.
from datetime import * @app.route('/now') def now(): maintenant = datetime.now() h = maintenant.hour mn = maintenant.minute return render_template("now.htm", heure = h, minute =mn)
J'importe le module datetime.
Je crée ensuite une deuxième route (/now) qui appelle la fonction du même nom : now()
Cette fonction détermine l'horaire actuel sous forme de 2 variables : h & mn.
Cette fonction redirige vers la page "now.htm".
Notez bien les arguments de la méthode render_template que l'on peut exprimer ainsi :
redirection vers la page "now.htm" ; la variable heure du template récupère le contenu de la variable h du script ;
la variable minute du template récupère la variable mn du script.
Je donne le même nom racine à la route, la fonction dans cette route et le template vers lequel redirige la route. Ici j'ai la route/fonction et template se nomment respectivement : /now ; now() & now.htm
Il faut donc créer un template nommé "now.htm" (toujours dans le répertoire "templates").
Le code du fichier "now.htm" :
^
Le code HTML contient des variables (indiquées par une double paire d'accolades) ; c'est la notation surnommée "moustache".
Flask utilise le moteur de templates Jinja qui est capable d'interpréter ce" HTML enrichi".
Le serveur web étant toujours actif, le navigateur étant toujours ouvert ;
tapez dans la barre d'URL localhost:5000/now
Au bout d'une minute, actualisez la page : l'affichage a changé. Il s'agit donc d'une page dynamique.
J'ajoute une liste de dictionnaire et une nouvelle route dans "application.py"
membres =[ {'nom' : 'Dumont', 'mail':'dumont@free.fr', 'genre': 'm'}, {'nom' : 'Durand', 'mail':'durand@orange.fr','genre': 'f'}, {'nom' : 'Dumoulin', 'mail':'dumoulin@gmail.com', 'genre': 'm'}, {'nom' : 'Tailleur', 'mail':'tailleur@free.fr', 'genre': 'f'}, {'nom' : 'Lefranc', 'mail':'lefranc@free.fr','genre': 'm'}, {'nom' : 'lefèvre', 'mail':'lefevre@orange.fr','genre': 'f'} @app.route("/adherents") def adherents(): return render_template("adherents.htm", liste = membres)
J'ai donc rajouté dans le script une liste de dictionnaires nommée "membres".
Ici l'objet "membres" (de type list) comprent 6 dictionnaires.
Une liste de dictionnaires est une structure de données complexe mais très intéressante car ressemble à une table de base de données.
Tous les dictionnaires de la liste doivent avoir les mêmes clés ; ici : nom, mail et genre.
Je rajoute aussi une route qui redirige vers la page "adherents.htm" avec un passage de paramètres : liste = membres.
Il faut produire un nouveau template nommé "adherents.htm" (toujours dans le dossier "templates" bien sûr). dont le code figure ci-dessous.
Observez la feuille de style.
Notez l'instruction "moustache" : {{liste}}. Ainsi je peux manipuler des variables dans un template.
Le serveur web étant actif, tapez dans la barre d'URL du navigateur : localhost:5000/adherents
La liste de dictionnaires s'affiche mais l'affichage n'est pas très joli ni lisible à cause des crochets et accolades de cette
liste de dictionnaires.
On remplace l'instruction <p>{{liste}}
par une boucle :Au sein d'un template on peut créer une boucle avec la syntaxe Python à condition de l'encadrer par {% et %}.
L'instruction % endfor % est obligatoire dans ce contexte.
Une ligne pour chaque dictionnaire ; les crochets ont disparu mais il y a toujours les accolades et les guillemets simples.
Il faut maintenant nous débarasser des accolades en modifiant le code de la boucle.
Aperçu dans le navigateur :
Cette fois c'est joli car crochets et accolades ont disparu !
Vous savez sans doute que l'on peut passer des paramètres dans une URL.
C'est d'ailleurs ce que vous faites lorsque vous soumissionnez un formulaire basé sur la méthode GET.
Par exemple allez sur le site "pagesjaunes" et renseignez le formulaire de la page d'accueil :
Saisissez "hotel" et "Paris" puis validez.
La barre d'adresse contient alors :
http://www.pagesjaunes.fr/annuaire/ chercherlespros?quoiqui=hotel&ou=paris
Les paramètres passés correspondent à ce qui suit le ? : quoiqui = hotel & ou paris.
On parle aussi de chaine de requête.
from flask import Flask, render_template, request ... @app.route("/adherents") def adherents(): sexe =request.args.get('g') if sexe: selection = \ [membre for membre in membres if membre['genre'] == sexe] else: selection = membres return render_template("adherents.htm", liste = selection)
J'importe désormais l'objet request de la bibiothèque flask.
Puis je modifie la route "adherents".
sexe =request.args.get('g') : récupère l'argument "g" passé à l'URL.
Si la variable "sexe" n'est pas à none, j'utilise sa valeur pour créer une liste "selection" en compréhension : liste
des femmes OU liste des messieurs en fonction de l'argument saisi dans l'URL.
Sinon la liste "selection" correspond à la liste "membres".
Si "sexe" n'est pas à none mais est différent de "f" ou "m" alors la liste "selection" sera vide !
Je vous communique le nouveau code de la partie BODY.
{% if liste|length ==0 %} : si la liste "liste" est vide alors on affiche un message d'erreur
car vous avez passé un mauvais argument à l'URL (différent de "f" ou "m").
Dans la barre d'URL ! localhost:5000/adherents?g=h
Dans la barre d'URL ! localhost:5000/adherents?g=m
Faites un clic droit dans la fenêtre du navigateur et sélectionnez "inspecter" (pour accéder aux "outils de *
développement de Chrome) ; sélectionnez l'onglet "élements" ; le code source s'affiche !
Il est repris ci-dessous (extraits) :
Les variables, tests, boucles ont été traduits en HTML.
Je vous ai montré qu'avec le framework Flask et dans le cadre du modèle MVC, les affichages se font grâce
aux templates et les traitements se réalisent dans le script.
Dans le chapitre suivant vous verrez que les entrées se réalisent aussi via des templates mais contenant cette fois
des formulaires de saisie.