Flask-Konfigurationsverwaltung
Jede Anwendung benötigt Konfiguration – Datenbankadressen, Schlüssel, Debug-Modus-Schalter und so weiter.
Flask bietet ein flexibles Konfigurationssystem, das das Laden von Konfiguration aus mehreren Quellen unterstützt, um unterschiedliche Anforderungen in Entwicklung und Produktion zu erfüllen.
Grundlagen des Konfigurationsobjekts
Flask-Anwendungskonfiguration wird inapp.configgespeichert. Sie ist wie ein Wörterbuch, und Sie können jeden Konfigurationswert über den Schlüsselnamen lesen und schreiben:
Beispiel
app = Flask(__name__)
# Konfigurationseinträge direkt festlegen
app.config["SECRET_KEY"] = "your-secret-key"
app.config["DEBUG"] = True
app.config["DATABASE"] = "example.db"
# Konfiguration lesen
print(app.config["SECRET_KEY"]) # Ausgabe: your-secret-key
print(app.debug) # Ausgabe: True (DEBUG kann über das Attribut app.debug abgerufen werden)
Namen der KonfigurationsschlüsselMüssen vollständig in Großbuchstaben geschrieben seinDies ist eine Flask-Konvention, die zusammen mit den Methoden zum Laden der Konfiguration verwendet wird.
Integrierte Konfigurationselemente
Flask verfügt über eine große Anzahl integrierter Konfigurationselemente, um das Verhalten des Frameworks zu steuern. Die folgenden werden in der Entwicklung am häufigsten verwendet:
| Konfigurationselement | Type | Standardwert | Beschreibung |
|---|---|---|---|
| DEBUG | bool | Keine | Ob der Debug-Modus aktiviert werden soll (muss in der Produktion False sein) |
| TESTING | bool | False | Ob der Testmodus aktiviert werden soll |
| SECRET_KEY | str | Keine | Der geheime Schlüssel, der zum Signieren der Session verwendet wird (muss gesetzt werden) |
| SERVER_NAME | str | Keine | Server-Domain + Port, z. B. "example.com:5000" |
| MAX_CONTENT_LENGTH | int | Keine | Maximale Größe des Request-Bodys (in bytes), verwendet, um Uploads zu begrenzen |
| SESSION_COOKIE_NAME | str | "session" | Session-Cookie-Name |
| PERMANENT_SESSION_LIFETIME | timedelta | 31 Tage | Gültigkeitsdauer einer permanenten Session |
Aus Python-Datei laden — from_pyfile
Die gängigste Praxis ist, die Konfiguration in eine separate Python-Datei zu schreiben und sie dann zu laden:
# 文件路径: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
app.py-Code:
# 文件路径: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
Aus Umgebungsvariablen laden——from_prefixed_env
Das Laden aus Umgebungsvariablen ist eine empfohlene Praxis der 12-Faktor-App und am besten für den Produktionseinsatz geeignet.
Flask liest standardmäßigFLASK_Umgebungsvariablen mit dem Präfix, und es wird versucht, die Werte als JSON-Typ zu parsen:
# 在终端设置环境变量(或写入 .flaskenv 文件) export FLASK_SECRET_KEY="prod-secret" export FLASK_MAX_CONTENT_LENGTH=16777216
app.py-Code:
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_ 前缀的变量
Verschachtelte Konfiguration
Verwendung doppelter Unterstriche__Verschachtelte Konfiguration kann festgelegt werden:
$ export FLASK_DATABASE__HOST="localhost" $ export FLASK_DATABASE__PORT="5432"
Ergebnis nach dem Laden:
Beispiel
# Der Wert von config["DATABASE"] ist {"host": "localhost", "port": 5432}
print(app.config["DATABASE"]) # Ausgabe: {'host': 'localhost', 'port': 5432}
Aus JSON/TOML laden — from_file
Neben Python-Dateien und Umgebungsvariablen unterstützt Flask auch das Laden von Konfiguration aus Formaten wie JSON und TOML:
Beispiel
{
"SECRET_KEY": "example-secret",
"DATABASE_URL": "sqlite:///example.db",
"ITEMS_PER_PAGE": 20
}
Beispiel
app = Flask(__name__)
# Aus JSON-Datei laden (text=True gibt den Textmodus an, Standard ist True)
app.config.from_file("config.json", load=json.load)
# Aus TOML-Datei laden (erfordert tomllib oder tomli)
# import tomllib
# app.config.from_file("config.toml", load=tomllib.load, text=False)
Laden aus einem Objekt——from_object
Lade alle Attribute in Großbuchstaben direkt aus einem Python-Objekt (Modul oder Klasse):
Beispiel
class Config:
SECRET_KEY = "dev-key"
DATABASE = "dev.db"
class ProductionConfig(Config):
DEBUG = False
DATABASE = "prod.db"
class DevelopmentConfig(Config):
DEBUG = True
# Konfiguration anhand von Umgebungsvariablen auswählen
import os
config_mode = os.environ.get("FLASK_CONFIG", "development")
if config_mode == "production":
app.config.object(Production)
else:
app.config.from_object(DevelopmentConfig)
Der Instanzordner – private Konfiguration
Einige Konfigurationen eignen sich nicht zum Committen in ein Code-Repository (wie Produktionsgeheimnisse). Sie können iminstance-Ordner liegen:
Beispiel
# instance/config.py laden (diese Datei wird nicht in Git committet)
app.config.from_pyfile("config.py", silent=True)
# Der Instanzordner befindet sich normalerweise an einem separaten Ort außerhalb des Projektverzeichnisses
myflaskapp/
├── app.py
├── config.py # 公共配置(可提交到 Git)
└── instance/ # 不提交到 Git(.gitignore)
└── config.py # 私密配置(密钥等)
Priorität beim Laden der Konfiguration
Eine übliche Reihenfolge zum Laden der Konfiguration in der Praxis:
Beispiel
# 1. Standardkonfiguration laden (hartcodierte Standardwerte im Code)
app.config.update({
"ITEMS_PER_PAGE": 20,
"MAX_CONTENT_LENGTH": 16 * 1024 * 1024,
})
# 2. Instanzkonfiguration laden (instance/config.py, höhere Priorität als Standardwerte)
app.config.from_pyfile("config.py", silent=True)
# 3. Umgebungsvariablen laden (höchste Priorität, überschreibt alle vorherigen Einstellungen)
app.config.from_prefixed_env()
Diese Priorität stellt sicher: Standardwerte sind am schwächsten, Dateikonfiguration ist mittel und Umgebungsvariablen sind am stärksten – entsprechend den Best Practices der 12-Factor App.
Weitere Erweiterungen