Python : Flask

De Justine's wiki
Aller à la navigation Aller à la recherche

http://www.xavierdupre.fr/app/ensae_teaching_cs/helpsphinx/notebooks/TD2A_eco_debuter_flask.html

Qu'est-ce que c'est ?

Flask est un framework web léger pour Python. Son but est d'être souple et léger. Il utilise un système de templates et est sous licence BSD.

Première page

<syntaxhighlight lang='python'>

  1. !/usr/bin/env python3
  2. coding: utf-8

from flask import Flask


  1. On initialise notre application, qui s'appellera donc "app".
  2. __name__ renverra le script lui-même.

app = Flask(__name__)

  1. On définit une route avec ce décorateur :
  2. Notre code s'applique à la racine du site.

@app.route("/")

  1. Voici la fonction décorée : elle s'éxecute à l'affichage de la route en question.

def hello():

   return "Hi there"

if __name__ == "__main__":

   #run() est la méthode qui lance notre app. Cela lance un serveur web sur le port 5000.
   app.run()

</syntaxhighlight>

Ici, le terme "route" fait référence à la dernière partie d'une URL, celle qui donne le chemin des fichiers : www.site.fr/undossier/unepage

Un peu de style

Pour l'instant, la page est très basique. Nous allons devoir donner à Flask une structure de dossiers qu'il comprendra, avec templates et des styles prédéfinis pour l'application. Voici un exemple:

<source> . ├── hello_world_green.py ├── static │   └── main.css └── templates

   └── home.html

</source>

  • hello_world_green.py est le script principal.
  • static contient une feuille de style main.css
  • templates contient une page html.

<syntaxhighlight lang='python'>

  1. !/usr/bin/env python
  2. -*- coding: utf-8 -*-

from flask import Flask, render_template app = Flask(__name__)

@app.route("/") def hello():

   return render_template("home.html", message = "Hello World!")
   #render_template fait le lien entre la page html, qui est un template, et le script en lui-même.
   #On voit que l'appel de fonction initialise la variable message, qui est une variable utilisateur (pas définie par Flask)

if __name__ == "__main__":

   app.run()

</syntaxhighlight>

<source lang="css">
  1. static/main.css

h1 {

 font-size: 2em;
 color: green;
 text-align: center;

} </source>

<source lang="html">
  1. /templates/home.html

<!doctype html> <html lang="en">

   <head>

<link rel ="stylesheet" type="text/css" href="Modèle:Url for('static', filename='main.css')" #Ici, on appelle le css

   </head>
   <body>

Modèle:Message

#On reconnaît les variables à la Jinja2 !

   </body>

</html> </source> </nowiki>

Plusieurs pages

Tout ça c'est sympa, mais si on pouvait naviguer entre les pages ? Pour cela, il suffit de rajouter une route:

<syntaxhighlight lang='python'>

  1. !/usr/bin/env python
  2. -*- coding: utf-8 -*-

from flask import Flask, render_template app = Flask(__name__)

  1. Première page

@app.route("/") def hello():

   return render_template("home.html", message_bienvenue = "Bienvenue sur la page d'accueil !")
  1. Deuxième page

@app.route("/next") def suite():

   return render_template("page_suivante.html")

if __name__ == "__main__":

   app.run()

</syntaxhighlight>

Nous avons nos deux pages, qui contiennent des liens:

<syntaxhighlight lang='html'>

  1. templates/home.html

<!doctype html> <html lang="en">

   <head>

<link rel ="stylesheet" type="text/css" href="Modèle:Url for('static', filename='main.css')"

   </head>
   <body>

Modèle:Message bienvenue

   </body>
       <a href="Modèle:Url for('suite')"> Cliquer pour continuer </a>

</html> </syntaxhighlight>

<syntaxhighlight lang='html'>

  1. templates/home.html

<!doctype html> <html lang="en">

   <head>

<link rel ="stylesheet" type="text/css" href="Modèle:Url for('static', filename='main.css')"

   </head>
   <body>

Vous êtes sur la 2eme page

   </body>

<a href="Modèle:Url for('hello')"> retourner à la page d'accueil </a> </html></syntaxhighlight>

Ici, encore une fois, on voit bien les appels à la fonction intégrée à Flask "url_for", qui fait le lien avec les deux routes déclarées.