Configuration de l'application

Configuration de l’application

Une application Flask est une instance de la classe Flask. Tout ce qui concerne cette application, que ce soit sa configuration ou ses URLs, sera enregistré dans cette classe.

La façon la plus simple de créer une application Flask est de créer une instance de la classe Flask globale, directement au début de votre code, comme l’exemple « Hello, World! » sur la page précédente. Bien que cette approche soit simple et utile dans certains cas, elle peut causer des soucis lorsque le projet grandit.

Au lieu de créer un instance globale de la classe Flask, vous allez la créer dans une fonction. Cette fonction est généralement appelée l’usine à applications (application factory en anglais). Toutes les opérations liées à la configuration de l’application doivent se faire dans cette fonction qui retourne l’application.

L’Usine à Applications

Il est temps de commencer à coder. Créez le répertoire mobility et ajoutez-y le fichier __init__.py. Le fichier __init__.py possède deux rôles. Tout d’abord, il contient l’usine à applications. Depuis, il indique à Python que le répertoire mobility doit être considéré comme étant un package. Vous pouvez trouver ci-dessous, l'exemple de l'application "Hello, World!" utilisant un fichier __init__.py.

$ mkdir mobility

mobility/__init__.py

from flask import Flask

def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__)
    @app.route('/hello')
    def hello():
        return 'Hello, World!'
    return app

Vous pouvez utiliser ce squelette comme base pour le reste du TP. Néanmoins en pratique, pour des applications Flask plus compliqué ce fichier sera plus fourni. Voici un exemple illustrant quelques mécanismes de Flask plus avancés, ainsi qu'une explication de leur fonctionnement. Vous ne devez pas l'utiliser pour ce TP.

mobility/__init__.py

import os

from flask import Flask


def create_app(test_config=None):
      # create and configure the app
      app = Flask(__name__, instance_relative_config=True)
      app.config.from_mapping(
         SECRET_KEY='dev'
      )

      if test_config is None:
         # load the instance config, if it exists, when not testing
         app.config.from_pyfile('config.py', silent=True)
      else:
         # load the test config if passed in
         app.config.from_mapping(test_config)

      # ensure the instance folder exists
      try:
         os.makedirs(app.instance_path)
      except OSError:
         pass

      # a simple page that says hello
      @app.route('/hello')
      def hello():
         return 'Hello, World!'

      return app

create_app est la fonction contenant l’usine à applications.

  1. app = Flask(__name__, instance_relative_config=True) crée une instance de la classe Flask.

    • __name__ est le nom du module Python courant. L’application doit connaître l’endroit où elle est installée pour configurer certains chemins et __name__ est une solution classique pour obtenir cette information.

    • instance_relative_config=True indique à l’application que les fichiers de configuration sont relatifs au répertoire instance folder. Ce répertoire est localisé en dehors du package mobility et peut contenir des données locales qui ne doivent pas être intégrées au contrôle de version, comme les secrets utilisés dans la configuration et le fichier contenant la base de données.

  2. app.config.from_mapping() spécifie plusieurs paramètres par défaut que l’application va utiliser:

    • SECRET_KEY est utilisé par Flask et des extensions pour stocker des données de façon sûre. Il est initialisé à la valeur 'dev' qui est une valeur facile pendant le développement de l’application, mais doit être remplacé par une valeur aléatoire lorsque celle-ci est mise en production.

  3. app.config.from_pyfile() remplace la configuration par défaut avec des paramètres spécifiés dans le fichier config.py qui se trouve dans l”instance folder si celui-ci existe. Par exemple, en production, cela peut être utilisé pour fixer une SECRET_KEY vraiment secrète.

    • Le paramètre test_config peut aussi être passé à l’usine à applications. Dans ce cas, il sera utilisé à la place de la configuration de l’instance. Cela vous permettra de spécifier des paramètres pour vos tests qui sont indépendants de ceux que vous utilisez durant le développement de l’application.

  4. os.makedirs() vérifie que le chemin app.instance_path existe. Flask ne crée pas l’instance folder automatiquement, mais celui-ci doit être créé, car votre projet cherchera à y créer le fichier contenant sa base de données SQLite.

  5. @app.route() crée une route simple de façon à vous permettre de voir l’application fonctionner avant de faire l’entièreté du tutoriel. Elle relie l’URL /hello à une fonction qui retourne une réponse, dans ce cas la chaîne de caractères 'Hello, World!'.

Lancer l’application

Vous pouvez maintenant lancer votre application en utilisant la commande flask. Depuis le terminal, indiquez à Flask où trouver l’application et ensuite lancez-le en mode développement. N’oubliez pas de vous placer d’abord dans le répertoire base-project et non dans le package mobility.

Le mode de développement lance automatiquement un débugger interactif lorsqu’une page lance une exception et relance le serveur chaque fois que vous modifiez votre code. Vous pouvez le laisser fonctionner et devez juste recharger la page dans votre navigateur au fur et à mesure de votre progression dans le tutoriel.

$ flask --app=mobility --debug run

Vous devriez observer une sortie équivalente au texte ci-dessous sur la sortie standard:

* Serving Flask app "mobility"
* Environment: development
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 855-212-761

Vous pouvez maintenant visiter l’URL http://127.0.0.1:5000/hello dans un navigateur et vous devriez voir le message « Hello, World! ». Félicitations, vous exécutez maintenant votre première application web en Flask!

Note

Dans une précédente version du cours, nous proposions d'utiliser des variables d'environnement plutôt que les paramètres --app et --debug. Nous laissons ces informations au cas où vous les chercheriez, mais la méthode ci-dessus convient parfaitement.

Pour Linux et Mac:

$ export FLASK_APP=mobility
$ export FLASK_DEBUG=1
$ flask run

Pour Windows via l’invite de commandes, utilisez set au lieu de export:

> set FLASK_APP=mobility
> set FLASK_DEBUG=1
> flask run

Pour Windows Powershell, utilisez $env: au lieu de export:

> $env:FLASK_APP = "mobility"
> $env:FLASK_DEBUG = "1"
> flask run

Continuez en lisant le document Plans et vues.