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 flaskr et ajoutez-y le fichier __init__.py. Le fichier __init__.py a deux rôles. Tout d’abord, il contient l’usine à applications. Depuis, il indique à Python que le répertoire flaskr doit être considéré comme étant un package.

$ mkdir flaskr
flaskr/__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',
        DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
    )

    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. Vous la compléterez plus tard dans ce tutoriel, mais elle réalise déjà beaucoup d’opérations.

  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ù est elle 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 flaskr 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 de 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.

    • DATABASE est le chemin où le fichier contenant la base de données SQLite sera sauvegardé. Le préfixe de ce fichier est app.instance_path, c’est-à-dire le chemin choisi par Flask comme instance folder. Vous en apprendrez plus sur la base de données dans la section suivante.

  3. app.config.from_pyfile() remplace le 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 exite. Par exemple, en production, cela peut être utilisé pour fixer une SECRET_KEY vraiment secrète.

    • La 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 test 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éer pas l’instance folder automatiquement, mais celui-ci doit être créé car votre projet cherhera à 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évelopemment. N’oubliez pas de vous placer d’abord dans le répertoire flask-tutorial et non dans le package flaskr.

Le mode développement lance automatiquement un débuger 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.

Pour Linux et Mac:

$ export FLASK_APP=flaskr
$ export FLASK_ENV=development
$ flask run

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

> set FLASK_APP=flaskr
> set FLASK_ENV=development
> flask run

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

> $env:FLASK_APP = "flaskr"
> $env:FLASK_ENV = "development"
> flask run

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

* Serving Flask app "flaskr"
* 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!

Continuez en lisant le document Construire et accéder à la base de données.