Le framework Flask§

1

Pourquoi un framework ?§

2

WSGI est minimaliste§

→ plus grand dénominateur commun

3

Inconvénients§

4

Qu'est-ce qu'un framework ?§

5

Frameworks Web en Python§

6

Flask : premiers pas§

7

Hello World Flask§

from flask import Flask

app = Flask(__name__)

@app.route("/")
def root():
    return "Hello world"
8

Explications§

9

Routes§

Note

Il est possible d'avoir plusieurs paramètres, par exemple /hello/<a>/<b>.

Il est également possible d'imposer un type aux paramètres, par exemple /user/<int:ident>.

Plus d'information dans la documentation.

10

Génération d'URL§

11

Génération d'URL§

12

Génération d'URL§

Exemple d'utilisation :

@app.route("/about")
def about():
    return """<a href="%s">Retour à la page d'accueil</a>""" % \
        url_for('root')

Indice

url_for rend le code plus facile à maintenir : si on décide de changer l'URL d'une vue, il suffit de changer le paramètre de app.route, et toutes les autres vues contenant des liens vers elle s'adapteront automatiquement.

13

Ressources statiques§

14

Où est ma requête ?§

cf. http://flask.pocoo.org/docs/0.12/api/#incoming-request-data

15

Serveur de développement§

16

Serveur de développement§

17

Templates Jinja2§

18

Qu'est-ce qu'un template?§

19

Templates en Flask§

20

Substitution§

21

Structures de contrôle§

{% if elements %}
  <ul>
  {% for e in elements %}
    <li><a href="{{e.link}}">{{e.name}}</li>
  {% endfor %}
  </ul>
{% else %}
  <p>Aucun élément</p>
{% endif %}
22

Héritage§

layout.html:

<!DOCTYPE html><html>
<head><title>Le titre du site</title></head>
<body>
  <h1>Le titre du site</h1>
  {% block content %}{% endblock %}
  <footer>©2017 Université Lyon 1</footer>
</body></html>

hello.html:

{% extends "layout.html" %}
{% block content %}
  <p>Hello {{name}}</p>
{% endblock %}

Note

  • La directive extends permet à un template d'hériter d'un autre.
  • La directive block permet
    • au template parent de définir des zones personalisables, et
    • au template enfant de donner un contenu aux blocs définis par son parent.
23

Formulaires§

24

Routes et méthodes§

25

Récupération des paramètres§

26

Réponses personalisées§

27

Erreur§

Pour déclencher une réponse d'erreur (code HTTP 4xx), on peut utiliser la fonction flask.abort en lui passant le code de statut à retourner (et éventuellement, un message personnalisé).

Exemple :

abort(403, "Cette operation n'est pas autorisee")

Indice

La fonction abort lève une exception (ce qui explique qu'elle ne nécessite pas de return). Cette exception est interceptée par l'application Flask, qui la transforme en réponse HTTP avec le code d'erreur associé.

28

Redirecton§

Pour rediriger le client vers une autre URL (code HTTP 3xx), on peut utiliser la fonction flask.redirect.

Exemple :

return redirect(url_for("root"))
29

Pour aller plus loin§

Lorsqu'une vue retourne une chaîne de caractères (ce que nous avons vu jusqu'à maintenant), l'application Flask génère automatiquement une réponse standard (statut 200, contenu de type HTML).

Il est également possible pour une vue de retourner directement un objet Response, dont on peut alors personaliser les méta-données. Cet objet peut être produit grâce à la fonction flask.make_response.

Exemple :

resp = make_response(render_template("hello.html", name=n))
resp.headers["Cache-control"] = "max-age=3600"
return resp

Note

La fonction redirect vue ci-avant retourne un objet Response.

30