Gestion de la configuration Flask

Toute application a besoin de configuration — adresses de base de données, clés, commutateurs de mode de débogage, etc.

Flask fournit un système de configuration flexible qui prend en charge le chargement de la configuration depuis plusieurs sources afin de répondre à des besoins différents en développement et en production.


Notions de base sur l'objet Config

La configuration de l'application Flask est stockée dansapp.config. Dans celui-ci, il se comporte comme un dictionnaire, et vous pouvez lire et écrire n'importe quelle valeur de configuration par nom de clé :

Exemple

from flask import Flask

app = Flask(__name__)

# Définir directement les éléments de configuration
app.config["SECRET_KEY"] = "your-secret-key"
app.config["DEBUG"] = True
app.config["DATABASE"] = "example.db"

# Lire la configuration
print(app.config["SECRET_KEY"])  # Sortie : your-secret-key
print(app.debug)                 # Sortie : True (DEBUG est accessible via l'attribut app.debug)

Noms des clés de configurationDoivent être entièrement en majusculesIl s'agit d'une convention Flask, utilisée avec les méthodes de chargement de configuration.


Éléments de configuration intégrés

Flask dispose d'un grand nombre d'éléments de configuration intégrés pour contrôler le comportement du framework. Les suivants sont les plus couramment utilisés en développement :

Élément de configuration Type Valeur par défaut Description
DEBUG bool Aucune Indique s'il faut activer le mode débogage (doit être False en production)
TESTING bool False Indique s'il faut activer le mode test
SECRET_KEY str Aucune La clé secrète utilisée pour signer la Session (doit être définie)
SERVER_NAME str Aucune Domaine du serveur + port, par ex. "example.com:5000"
MAX_CONTENT_LENGTH int Aucune Taille maximale du corps de la requête (en octets), utilisée pour limiter les téléversements
SESSION_COOKIE_NAME str "session" Nom du cookie de session
PERMANENT_SESSION_LIFETIME timedelta 31 jours Durée de validité de la session permanente

Charger depuis un fichier Python — from_pyfile

La pratique la plus courante consiste à écrire la configuration dans un fichier Python séparé, puis à la charger :

# 文件路径:config.py(与 app.py 同级目录)
# 注意:所有键名必须大写
SECRET_KEY = "your-production-secret-key"
DATABASE_URL = "postgresql://user:pass@localhost/db"
MAX_CONTENT_LENGTH = 16 * 1024 * 1024  # 限制上传文件大小 16MB

# 开发配置
DEBUG = True

Code de app.py :

# 文件路径:app.py
from flask import Flask

app = Flask(__name__)

# 加载 config.py 中所有大写的变量到 app.config
app.config.from_pyfile("config.py")

print(app.config["DATABASE_URL"])  # 输出: postgresql://user:pass@localhost/db

Charger depuis les variables d'environnement——from_prefixed_env

Le chargement à partir des variables d'environnement est une pratique recommandée de la 12-Factor App, la mieux adaptée au déploiement en production.

Flask lit par défautFLASK_les variables d'environnement avec le préfixe, et une analyse des valeurs en type JSON sera tentée :

# 在终端设置环境变量(或写入 .flaskenv 文件)
export FLASK_SECRET_KEY="prod-secret"
export FLASK_MAX_CONTENT_LENGTH=16777216

Code de app.py :

from flask import Flask
from datetime import timedelta

app = Flask(__name__)

# 加载默认配置
app.config["PERMANENT_SESSION_LIFETIME"] = timedelta(days=7)

# 自动加载所有以 FLASK_ 开头的环境变量
# 例如 FLASK_SECRET_KEY 会成为 config["SECRET_KEY"]
app.config.from_prefixed_env()

# 也可以自定义前缀
# app.config.from_prefixed_env("EXAMPLE")  # 加载 EXAMPLE_ 前缀的变量

Configuration imbriquée

Utilisation de doubles underscores__La configuration imbriquée peut être définie :

$ export FLASK_DATABASE__HOST="localhost"
$ export FLASK_DATABASE__PORT="5432"

Résultat après chargement :

Exemple

app.config.from_prefixed_env()
# La valeur de config["DATABASE"] est {"host": "localhost", "port": 5432}
print(app.config["DATABASE"])  # Sortie : {'host': 'localhost', 'port': 5432}

Charger depuis JSON/TOML — from_file

Outre les fichiers Python et les variables d'environnement, Flask prend également en charge le chargement de la configuration à partir de formats tels que JSON et TOML :

Exemple

// Chemin du fichier : config.json
{
  "SECRET_KEY": "example-secret",
  "DATABASE_URL": "sqlite:///example.db",
  "ITEMS_PER_PAGE": 20
}

Exemple

import json

app = Flask(__name__)

# Charger depuis un fichier JSON (text=True indique le mode texte, la valeur par défaut est True)
app.config.from_file("config.json", load=json.load)
# Charger depuis un fichier TOML (nécessite tomllib ou tomli)
# import tomllib
# app.config.from_file("config.toml", load=tomllib.load, text=False)

Charger depuis un objet——from_object

Charger tous les attributs en majuscules directement depuis un objet Python (module ou classe) :

Exemple

# Bonne pratique recommandée : définir des classes de configuration pour distinguer les environnements
class Config:
    SECRET_KEY = "dev-key"
    DATABASE = "dev.db"

class ProductionConfig(Config):
    DEBUG = False
    DATABASE = "prod.db"

class DevelopmentConfig(Config):
    DEBUG = True

# Sélectionner la configuration en fonction des variables d'environnement
import os
config_mode = os.environ.get("FLASK_CONFIG", "development")
if config_mode == "production":
    app.config.from_object(ProductionConfig)
else:
    app.config.from_object(DevelopmentConfig)

Le dossier d'instance—configuration privée

Certaines configurations ne doivent pas être versionnées dans un dépôt de code (comme les clés secrètes de production). Elles peuvent être placées dansinstanceDans le dossier :

Exemple

app = Flask(__name__, instance_relative_config=True)

# Charger instance/config.py (ce fichier n'est pas versionné dans Git)
app.config.from_pyfile("config.py", silent=True)

# Le dossier d'instance se trouve généralement à un emplacement séparé, en dehors du répertoire du projet
myflaskapp/
├── app.py
├── config.py         # 公共配置(可提交到 Git)
└── instance/          # 不提交到 Git(.gitignore)
    └── config.py     # 私密配置(密钥等)

Priorité de chargement de la configuration

Un ordre courant de chargement de la configuration en pratique :

Exemple

app = Flask(__name__)

# 1. Charger la configuration par défaut (valeurs par défaut codées en dur dans le code)
app.config.update({
    "ITEMS_PER_PAGE": 20,
    "MAX_CONTENT_LENGTH": 16 * 1024 * 1024,
})

# 2. Charger la configuration de l'instance (instance/config.py, priorité supérieure aux valeurs par défaut)
app.config.from_pyfile("config.py", silent=True)

# 3. Charger les variables d'environnement (priorité la plus élevée, remplace tous les paramètres précédents)
app.config.from_prefixed_env()

Une telle priorité garantit : les valeurs par défaut sont les plus faibles, la configuration de fichier est moyenne, et les variables d'environnement sont les plus fortes—conformément aux bonnes pratiques de la 12-Factor App.

autres extensions