technique:python:flask

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
technique:python:flask [2020/03/24 23:18] francoisatechnique:python:flask [2024/04/02 15:08] (Version actuelle) – modification externe 127.0.0.1
Ligne 1: Ligne 1:
-====== Flask ====== +**Cette page est obsolèteVeuillez accéder au contenu à son nouvel emplacement : [[https://bibliotech.cemea.org/books/outils-technique/page/flask|flask]]**
- +
-Mini framework pour faire une petite appli web avec des templates, du mail… : [[https://palletsprojects.com/p/flask/|https://palletsprojects.com/p/flask/]] +
- +
-6 tutos vidéos sympa en français : [[https://www.youtube.com/playlist?list=PLn6POgpklwWrbGpkwkTS-TvnXxp34srC4|https://www.youtube.com/playlist?list=PLn6POgpklwWrbGpkwkTS-TvnXxp34srC4]] +
- +
-5 autres sur Flask et les formulaires[[https://www.youtube.com/channel/UCABGT_MVqwPXXbdrOO_uYFQ/videos|https://www.youtube.com/channel/UCABGT_MVqwPXXbdrOO_uYFQ/videos]] +
- +
-[[https://www.tutorialspoint.com/flask/index.htm|https://www.tutorialspoint.com/flask/index.htm]] +
- +
-[[https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world|https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world]] +
- +
-Requêtes query strings, Form Data, Json Data, POST et GET : [[https://scotch.io/bar-talk/processing-incoming-request-data-in-flask|https://scotch.io/bar-talk/processing-incoming-request-data-in-flask]] +
- +
-===== Créer une appli Flask avec un template jinja2 et quelques routes ===== +
- +
-myapp.py : +
-<code> +
- +
-#!/usr/bin/python +
-# -*- coding: Utf-8 -*+
- +
-from flask import Flask, render_template +
- +
-app = Flask(__name__) +
- +
-@app.route('/'+
-@app.route('/accueil'+
-def index(): +
- +
-    # dictionnaire de data +
-    mesdata = {'user': 'Xavki', 'machine': 'lubuntu-18.04'+
- +
-    # affichage +
-    return render_template('index.html', title='Home', data=mesdata) +
- +
-@app.route('/hello/<string:username>'+
-def bonjour(username): +
-    # on oblige username a être une chaine +
-    return "Page Hello " + username + " et bonjour !<br/><a href=" + url_for('index') + ">Retour</a>" +
- +
-if __name__ == '__main__': +
-    app.run(host='0.0.0.0', port=8080) +
- +
-</code> +
- +
-Dans le sous-dossier "templates", un fichier index.html +
- +
-<code> +
-<html> +
-    <head> +
-        <title>{{ title }} - Microblog</title> +
-    </head> +
-    <body> +
-        <h1>Hello, {{ data.user }}!</h1> +
-                <p>Tu es connecté de la machine : {{ data.machine }}</p> +
-    </body> +
-</html> +
- +
-</code> +
- +
-Cas avec un template plus élaboré avec des appels aux librairies plateform (pour OS local) et netifaces (pour interfaces réseau)\\ +
-On rajoute : +
- +
-<code> +
-import platform +
-import netifaces +
- +
-    data = { +
-      'user': 'Xavki', +
-      'machine': platform.node(), +
-      'os': platform.system(), +
-      'dist': platform.linux_distribution(), +
-      'interfaces': netifaces.interfaces() +
-    } +
- +
-@app.route('/pages/a/b/c'+
-def pages(a,b,c): +
-    context= {'a':a, 'b':b, 'c':c} +
-    return render_template('abc.html', **context} +
- +
-</code> +
- +
-Et dans le template html : +
- +
-<code> +
-    <p>Machine : {{ data.machine }}</p> +
-    <p> Variables de contexte : {{ a }} , {{ b }}, {{ c }}</p> +
-    <p>OS : {{ data.os }}</p> +
-    <p>Distribution : </p> +
-    {% for elem in data.dist %} +
-        <p style="padding-left:20px">- {{ elem }}</p> +
-    {% endfor %} +
-    <p>Interfaces : </p> +
-    {% for inter in data.interfaces %} +
-        <p style="padding-left:20px">- {{ inter }}</p> +
-    {% endfor %} +
-    {% if a == 0: %} +
-        <p> "a" is null </p> +
-    {% else %} +
-        <p> "a" is not null </p> +
-    {% endif %} +
- +
-</code> +
- +
-===== Héritage de Templates jinja ===== +
- +
-[[https://jinja.palletsprojects.com/en/2.11.x/|https://jinja.palletsprojects.com/en/2.11.x/]] +
- +
-Fichier HTML (base.html) à créer dans un dossier "**templates**" +
- +
-Ajouter {% block contenu %}{% endblock %} dans le fichier générique "base.html" qui contient la partie commune. +
- +
-Et dans chaque fichier HTML (index.html, users.html), insérer par exemple : +
-<code> +
- +
-{% extends 'base.html' %} +
- +
-{% block contenu } +
-blabla +
-{% endblock %} +
- +
-</code> +
- +
-===== Fichiers statiques (images, css) ===== +
- +
-Création d'un dossier "static" et copie des images et css dedans. +
- +
-Et dans le template html, l'insérer avec +
- +
-<code> +
-<img src="{{ url_for('static', filname='monimage.jpg') }}" +
- +
-</code> +
- +
-===== Récupération de paramètres par URL ===== +
- +
-Ex : [[https://url/?mavar1=17&mavar2=57|https://url/?mavar1=17&mavar2=57]] (taille maxi recommandée : 256 caractères) +
-<code> +
- +
-from flask import request +
- +
-valeur1 = request.args.get('mavar1', 'valeur par défaut'+
-valeur2 = request.args.get('mavar2', 'valeur par défaut'+
-toutesvars = request.args +
- +
-</code> +
- +
-===== Récupération de paramètres par POST ou GET ===== +
- +
-Dans la route de réception, il faut rajouter la méthode autorisée comme 'get' ou 'post' +
- +
-<code> +
-@app.route('/login', methods=['GET','POST']) +
- +
-</code> +
- +
-Récupérer les données (passées dans le champ name=mavaleur du formulaire) avec : +
- +
-<code> +
-valeur = request.form['mavaleur'+
- +
-</code> +
- +
-request.method vaut 'POST' +
- +
-Le résultat est envoyé dans un dictionnaire {key : value} accessible par print(valeur.get["key"]) +
- +
-===== Gestion de hash / password ===== +
- +
-Vérifie la validité d'un mot de passe à partir du hash +
- +
-<code> +
-from werkzeug.security import generate_password_hash, check_password_hash +
- +
-motdepasse = 'pbkdf2:sha256:xxxxx' +
-if check_password_hash(motdepasse, password): +
-    blabla +
- +
-</code> +
- +
-===== Développement - debug ===== +
- +
-Mode développement pratique pour gérer les modifs en direct et l'accès au mode débug en console : +
- +
-<code> +
-export FLASK_ENV=development +
- +
-</code> +
- +
-ou ajouter un .env contenant ''FLASK_ENV=development'' +
- +
-Installer le module python-dotenv +
- +
-<code> +
-pip install python-dotenv +
- +
-</code> +
- +
-Et indiquer dans le script python : +
- +
-<code> +
-from dotenv import load_dotenv, find_dotenv +
- +
-load_dotenv(find_dotenv()) +
- +
-</code> +
- +
-===== Autre méthodes de Flask ===== +
- +
-abort : pour retourner un code d'erreur HTTP personnalisé (404, 403, 401…) +
- +
-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,nomfichier) +
  • technique/python/flask.1585088336.txt.gz
  • Dernière modification : 2020/04/11 02:26
  • (modification externe)