Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente | |||
| technique:python:flask [2021/03/18 01:42] – francoisa | technique:python:flask [2024/04/02 15:08] (Version actuelle) – modification externe 127.0.0.1 | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ====== Flask ====== | + | **Cette page est obsolète. Veuillez accéder |
| - | + | ||
| - | Mini framework pour faire une petite appli web avec des templates, du mail… : [[https:// | + | |
| - | + | ||
| - | 6 tutos vidéos sympa en français : [[https:// | + | |
| - | + | ||
| - | 5 autres sur Flask et les formulaires[[https:// | + | |
| - | + | ||
| - | [[https:// | + | |
| - | + | ||
| - | [[https:// | + | |
| - | + | ||
| - | Requêtes query strings, Form Data, Json Data, POST et GET : [[https:// | + | |
| - | + | ||
| - | Exemples de code : https:// | + | |
| - | + | ||
| - | ===== Créer une appli Flask avec un template jinja2 et quelques routes ===== | + | |
| - | + | ||
| - | myapp.py : | + | |
| - | < | + | |
| - | + | ||
| - | # | + | |
| - | # -*- coding: Utf-8 -*- | + | |
| - | + | ||
| - | from flask import Flask, render_template | + | |
| - | + | ||
| - | app = Flask(__name__) | + | |
| - | + | ||
| - | @app.route('/' | + | |
| - | @app.route('/ | + | |
| - | def index(): | + | |
| - | + | ||
| - | # dictionnaire de data | + | |
| - | mesdata = {' | + | |
| - | + | ||
| - | # affichage | + | |
| - | return render_template(' | + | |
| - | + | ||
| - | @app.route('/ | + | |
| - | def bonjour(username): | + | |
| - | # on oblige username a être une chaine | + | |
| - | return "Page Hello " + username + " et bonjour !< | + | |
| - | + | ||
| - | if __name__ == ' | + | |
| - | app.run(host=' | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | Dans le sous-dossier " | + | |
| - | + | ||
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | <p>Tu es connecté de la machine : {{ data.machine }}</ | + | |
| - | </ | + | |
| - | </ | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | Cas avec un template plus élaboré avec des appels aux librairies plateform (pour OS local) et netifaces (pour interfaces réseau)\\ | + | |
| - | On rajoute : | + | |
| - | + | ||
| - | < | + | |
| - | import platform | + | |
| - | import netifaces | + | |
| - | + | ||
| - | data = { | + | |
| - | ' | + | |
| - | ' | + | |
| - | ' | + | |
| - | ' | + | |
| - | ' | + | |
| - | } | + | |
| - | + | ||
| - | @app.route('/ | + | |
| - | def pages(a, | + | |
| - | context= {' | + | |
| - | return render_template(' | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | Et dans le template html : | + | |
| - | + | ||
| - | < | + | |
| - | < | + | |
| - | <p> Variables de contexte : {{ a }} , {{ b }}, {{ c }}</ | + | |
| - | <p>OS : {{ data.os }}</ | + | |
| - | < | + | |
| - | {% for elem in data.dist %} | + | |
| - | <p style=" | + | |
| - | {% endfor %} | + | |
| - | < | + | |
| - | {% for inter in data.interfaces %} | + | |
| - | <p style=" | + | |
| - | {% endfor %} | + | |
| - | {% if a == 0: %} | + | |
| - | <p> " | + | |
| - | {% else %} | + | |
| - | <p> " | + | |
| - | {% endif %} | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | ===== Héritage de Templates jinja ===== | + | |
| - | + | ||
| - | [[https:// | + | |
| - | + | ||
| - | Fichier HTML (base.html) à créer dans un dossier " | + | |
| - | + | ||
| - | Ajouter {% block contenu %}{% endblock %} dans le fichier générique " | + | |
| - | + | ||
| - | Et dans chaque fichier HTML (index.html, | + | |
| - | < | + | |
| - | + | ||
| - | {% extends ' | + | |
| - | + | ||
| - | {% block contenu } | + | |
| - | blabla | + | |
| - | {% endblock %} | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | ===== Fichiers statiques (images, css) ===== | + | |
| - | + | ||
| - | Création d'un dossier " | + | |
| - | + | ||
| - | Et dans le template html, l' | + | |
| - | + | ||
| - | < | + | |
| - | <img src=" | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | ===== Récupération de données par URL (query string) ===== | + | |
| - | + | ||
| - | Ex : [[https:// | + | |
| - | < | + | |
| - | + | ||
| - | from flask import request | + | |
| - | + | ||
| - | valeur1 = request.args.get(' | + | |
| - | valeur2 = request.args.get(' | + | |
| - | valeur3 = request.args[' | + | |
| - | toutesvars = request.args | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | ===== Récupération de données par POST ou GET ===== | + | |
| - | + | ||
| - | Dans la route de réception, il faut rajouter la méthode autorisée comme ' | + | |
| - | + | ||
| - | < | + | |
| - | @app.route('/ | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | Récupérer les données (passées dans le champ name=mavaleur du formulaire) avec : | + | |
| - | + | ||
| - | < | + | |
| - | valeur1 = request.form.get(' | + | |
| - | valeur2 = request.form[' | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | ===== Récupération de données en Json ===== | + | |
| - | + | ||
| - | Cas de Mailgun ou autres webhook. Le Json n'est accessible qu'en POST. | + | |
| - | + | ||
| - | < | + | |
| - | mesdata = request.get_json() | + | |
| - | framework = mesdata[' | + | |
| - | if ' | + | |
| - | language = mesdata[' | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | request.method vaut ' | + | |
| - | + | ||
| - | Le résultat du form ou du Json est envoyé dans un dictionnaire {key : value} accessible par print(valeur.get[" | + | |
| - | + | ||
| - | ===== Gestion de hash / password ===== | + | |
| - | + | ||
| - | Vérifie la validité d'un mot de passe à partir du hash | + | |
| - | + | ||
| - | < | + | |
| - | from werkzeug.security import generate_password_hash, | + | |
| - | + | ||
| - | motdepasse = ' | + | |
| - | if check_password_hash(motdepasse, | + | |
| - | blabla | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | ===== Développement - debug ===== | + | |
| - | + | ||
| - | Mode développement pratique pour gérer les modifs en direct et l' | + | |
| - | + | ||
| - | < | + | |
| - | export FLASK_ENV=development | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | ou ajouter un .env contenant '' | + | |
| - | + | ||
| - | Installer le module python-dotenv | + | |
| - | + | ||
| - | < | + | |
| - | pip install python-dotenv | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | Et indiquer dans le script python : | + | |
| - | + | ||
| - | < | + | |
| - | from dotenv import load_dotenv, | + | |
| - | + | ||
| - | load_dotenv(find_dotenv()) | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | ===== Autre méthodes de Flask ===== | + | |
| - | + | ||
| - | abort : pour retourner un code d' | + | |
| - | + | ||
| - | redirect : pour rediriger vers une page | + | |
| - | + | ||
| - | ===== Méthode pour parcourir un dossier de fichiers (à détailler) ===== | + | |
| - | + | ||
| - | os.walk(dossier_a_parcourir)\\ | + | |
| - | Renvoie : parent, listedossiers (dnames), listefichiers (fnames) | + | |
| - | + | ||
| - | os.path.join(parent, | + | |
| - | + | ||
| - | ===== Méthodes de Logging Flask pour traces ===== | + | |
| - | + | ||
| - | 1) Avec une methode dédiée | + | |
| - | + | ||
| - | [[https://pypi.org/ | + | |
| - | + | ||
| - | 2) Avec la méthode de log de python | + | |
| - | + | ||
| - | [[https:// | + | |
| - | + | ||
| - | [[https:// | + | |
| - | + | ||
| - | 3) avec la doc Flask (librairie logging) | + | |
| - | + | ||
| - | [[https:// | + | |
| - | + | ||
| - | NB : penser à utiliser rsyslog pour rotation des logs. | + | |
| - | + | ||
| - | 4) Méthode de systemd (Rom1) | + | |
| - | + | ||
| - | utiliser des print() pour envoyer des messages dans la console comme : | + | |
| - | < | + | |
| - | + | ||
| - | print(" | + | |
| - | for key, value in request.form.items(): | + | |
| - | print(key," | + | |
| - | print(" | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | Et ensuite forcer leur écriture dans le journalctl : | + | |
| - | + | ||
| - | < | + | |
| - | import sys | + | |
| - | + | ||
| - | sys.stdout.flush() | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | Voir ensuite les logs dans journalctl avec : | + | |
| - | + | ||
| - | < | + | |
| - | journalctl -f -u nomduserviceflask.service # -f pour suivi en direct | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||