Le framework flask

Il existe de nombreuses librairies qui permettent de faciliter l’écriture de sites web interactifs en Python: Django, Webpy ou flask. Dans le cadre de ce projet nous avons choisi flask qui a l’avantage d’être simple à apprendre tout en pouvant profiter de la puissance de python.

Les premiers sites web étaient composés de pages HTML stockées dans des fichiers se trouvant dans un même répertoire. Le serveur web était alors simplement configuré pour servir tous les fichiers de ce répertoire. C’est ce que l’on appelle communément un site web statique, c’est-à-dire un site web composé de pages HTML qui ne changent pas. Ces sites web statiques sont intéressants pour du contenu tel que ce syllabus qui ne change que rarement. La plupart des sites web actuels sont dynamiques. Un programme reçoit les requêtes des utilisateurs et y répond en générant si nécessaire les pages HTML correspondantes à la volée. Flask permet de construire un tel site web assez facilement en python.

Avant de se lancer dans l’écriture d’un site web dynamique en flask, il faut se rappeler que sur le web, toute page est identifiée par son Uniform Resource Locator (URL). Quand un utilisateur interagit avec un site web à travers son navigateur, celui-ci charge différentes pages en utilisant l’HyperText Transport Protocol (HTTP). Le fonctionnement détaillé de HTTP sort du cadre de ce cours, mais vous devez savoir qu’un navigateur peut utiliser HTTP de deux façons différentes.

La première est d’envoyer une requête GET HTTP pour un URL particulier. Le serveur web répond à cette requête en renvoyant au navigateur la page HTML correspondant à l’URL demandé. L’immense majorité des requêtes qu’un navigateur fait à un serveur web sont des GET HTTP.

A côté de ces requêtes GET HTTP, un navigateur peut aussi utiliser des requêtes POST HTTP. Une telle requête n’est utilisée que lorsque le navigateur veut envoyer de l’information autre qu’un URL au serveur. C’est par exemple le cas lorsque l’utilisateur remplit un formulaire sur une page web.

Dans un site web purement statique, le serveur web supporte uniquement les requêtes GET HTTP. Pour chaque URL demandé, il analyse la partie fichier de cet URL et si le fichier existe retourne son contenu et sinon une erreur. Pour illustrer cela, considérons que le serveur web est configuré pour servir le répertoire ci-dessous. Celui-ci contient deux fichiers et deux sous-répertoires.

index.html
page.html
css
images

Le répertoire css contient le fichier style.css qui est référencé par les deux pages HTML. Le répertoire images contient le fichier logo.png.

Le fichier index.html contient la page reprise ci-dessous.

<!DOCTYPE html>
<html>
<head>
  <link rel="stylesheet" href="css/style.css">
  <meta charset="utf-8">
  <title>Un titre</title>
</head>
<body>
  <img src="/images/logo.png">
  <h1>Page d'acceuil</h1>
  <p>Bienvenue sur la page d'acceuil notre site web.</p>
  <p>Vous trouverez d'autres informations <a href=
  "/page.html">ici</a></p>
</body>
</html>

Le site web a été configuré pour servir le document index.html lorsqu’un navigateur demande la racine du site web (/). Le navigateur reçoit donc ce fichier en réponse à sa requête GET HTTP. Il lit le contenu du document HTML et doit directement :

  • faire une requête GET HTTP pour charger la feuille de style (style.css)

  • faire une requête GET HTTP pour charger l’image /images/logo.png

Si l’utilisateur clique sur le lien vers page.html, le navigateur fera une nouvelle requête GET HTTP pour charger cette page depuis le serveur et afficher son contenu. L’interaction entre un navigateur web et un serveur est donc une succession de requêtes HTTP.

flask s’inspire de ce mode de fonctionnement et vous permet d’écrire un programme en python qui répond aux requêtes HTTP faites par le navigateur.

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    """
    retourne le contenu de la page index.html
    """
    return '<!-- contenu de index.html ...'

@app.route('/page.html')
def page():
    """
    retourne le contenu de la page page.html
    """
    return '<!-- contenu de page.html ...'

flask utilise des décorateurs python pour indiquer l’URL qui doit être associée à une fonction python. Lorsque le serveur reçoit une requête GET HTTP qui demande le fichier /, il exécute la fonction index() qui retourne le contenu correspondant au fichier index.html. Il en va de même pour la fonction page() qui est appelée automatiquement par le serveur web dès que celui-ci reçoit une requête pour page.html.

Note

Dans le cadre de ce premier projet web, nous utiliserons la technologie web en local. Le serveur que vous allez développer fonctionnera uniquement sur votre ordinateur et ne sera pas accessible depuis Internet. L’écriture d’un serveur web dynamique accessible depuis l’Internet nécessite de prendre en compte des contraintes au niveau de la sécurité qui sortent du cadre de ce cours de première année.

Nous vous invitons à suivre le tutoriel officiel de flask qui a été traduit en français et est disponible via : http://renaud-detry.net/teaching/flask/tutorial/index.html#tutorial