Programmation web avec Flask

Sylvain Fankhauser
Powerhouse

Bonjour !

C’est quoi un framework ?

  • Met à disposition un ensemble de librairies
  • Donne des bases pour structurer et organiser son code
  • Est destiné aux développeurs‧ses
  • Est orienté vers une utilisation spécifique (p.ex. «framework web» pour faire des sites web)

Un framework…

Flask est un micro-framework

ll ne fournit que le strict nécessaire

  • Système de routage
  • Abstraction des requêtes/réponses HTTP
  • Moteur de templates

Principaux composants de Flask

  • Django (Python)
  • FastAPI (Python)
  • Ruby on Rails (Ruby)
  • Symfony (PHP)

Quelques autres frameworks web

  • Système de routage
  • Abstraction des requêtes/réponses HTTP
  • Moteur de templates
  • Interaction avec des bases de données
  • Interface d’administration
  • Gestion de formulaires
  • Authentification
  • Internationalisation / localisation
  • Envoi de mails
  • Gestion de données géographiques

Comparaison rapide avec Django

  • Plus léger, donc plus facile d’apprendre les bases
  • Plus rapide
  • Plus extensible

Pourquoi Flask alors ?

Et les CMS ?

WordPress est-il un framework ?

CMS

  • Public cible : rédacteurs‧ices de contenu
  • Centré autour de la gestion de contenu

Framework

  • Public cible : développeurs‧euses
  • Centré autour de la gestion de code pour augmenter la productivité

Le cycle requête - réponse

def home(request):
  return HttpResponse(
    "<html><body><h1>Hello world!</h1></body></html>"
  )
from flask import Flask, request

app = Flask(__name__)


def home():
  return "<html><body><h1>Hello world!</h1></body></html>"

Flask est un peu différent

Interlude

Installation de Flask

Un paquet Python est un dossier avec des fichiers Python dedans

Les paquets Python s’installent avec l’outil pip

Par exemple:

python -m pip install flask

Problème : on ne peut avoir qu’une version de chaque paquet installée

Solution : les virtual environments (venv)

Création d’un environnement virtuel :

python -m venv mon_dossier

Chaque environnement virtuel est isolé

env1

Python 3.10

Flask 2.2.2

env2

Python 3.9

Flask 1.1.4

env3

Python 3.11

Django 3.2.11

Chaque environnement virtuel a son exécutable Python

Pour utiliser l’environnement virtuel :

./mon_env/bin/python -m flask run

 

Sur Windows:

mon_env\Scripts\python -m flask run

Pour raccourcir les commandes, on peut activer un environnement virtuel

Pour activer l’environnement virtuel :

source /mon_env/bin/activate

 

Puis on peut utiliser python normalement :

python -m flask run

 

Pour désactiver l’environnement :

deactivate
from flask import Flask, request

app = Flask(__name__)


def home():
  return "<html><body><h1>Hello world!</h1></body></html>"

Notre première page Flask

Lancez le serveur :

flask run

Puis naviguez vers http://localhost:5000/

Il manque quelque chose pour que ça fonctionne !

Il faut brancher les fonctions !

from flask import Flask, request

app = Flask(__name__)


@app.route("/")
def home():
  return "<html><body><h1>Hello world!</h1></body></html>"

Le branchement se fait avec @app.route

app.py

Lancez le serveur :

flask run

Puis naviguez vers http://localhost:5000/

Exercice

Créez une deuxième page et mettez un lien sur chaque page pour passer de l’une à l’autre

from flask import Flask, request

app = Flask(__name__)


@app.route("/")
def home():
  return "<html><body><h1>Hello world!</h1></body></html>"

app.py

😕

Les templates

from flask import Flask, render_template

app = Flask(__name__)


@app.route("/")
def home():
  return render_template("home.html")

app.py

😌

<html>
  <body>
    <h1>Hello world!</h1>
  </body>
</html>

templates/home.html

from flask import Flask, render_template

app = Flask(__name__)


@app.route("/")
def home():
  return render_template("home.html", name="Sylvain")

app.py

<html>
  <body>
    <h1>Salut {{ name }}!</h1>
  </body>
</html>

templates/home.html

Les variables de templates

Exercice

Un compteur de visites

https://bit.ly/3LA37d9

from flask import Flask, render_template

app = Flask(__name__)


@app.route("/")
def home():
  return render_template("home.html", people=["Julie", "Cyril", "Caipi"])

app.py

<html>
  <body>
    <h1>Les gens chics</h1>
    <ul>
      {% for person in people %}
        <li>{{ person }}</li>
      {% endfor %}
    </ul>
  </body>
</html>

templates/home.html

Les template tags

Exercice

(s’il nous reste du temps)

🤩 Un livre d’or 🤩

https://bit.ly/36ISZjH

Bravo !

🤔 Place aux questions 🧐

Made with Slides.com