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

from flask import Flask

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

app.config.from_prefixed_env()
# 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

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

Beispiel

import json

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

# Empfohlene Vorgehensweise: Konfigurationsklassen definieren, um Umgebungen zu unterscheiden
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

app = Flask(__name__, instance_relative_config=True)

# 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

app = Flask(__name__)

# 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