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
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
# 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
{
"SECRET_KEY": "example-secret",
"DATABASE_URL": "sqlite:///example.db",
"ITEMS_PER_PAGE": 20
}
Exemple
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
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
# 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
# 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