Управление конфигурацией во Flask

Любому приложению нужна конфигурация — адреса баз данных, ключи, переключатели режима отладки и так далее.

Flask предоставляет гибкую систему конфигурации, которая поддерживает загрузку конфигурации из нескольких источников, чтобы удовлетворить различные потребности при разработке и в продакшене.


Основы объекта конфигурации

Конфигурация приложения Flask хранится вapp.configОн похож на словарь, и можно читать и записывать любое значение конфигурации по имени ключа:

Пример

from flask import Flask

app = Flask(__name__)

# Непосредственная установка элементов конфигурации
app.config["SECRET_KEY"] = "your-secret-key"
app.config["DEBUG"] = True
app.config["DATABASE"] = "example.db"

# Чтение конфигурации
print(app.config["SECRET_KEY"])  # Вывод: your-secret-key
print(app.debug)                 # Вывод: True (DEBUG можно получить через атрибут app.debug)

Имена ключей конфигурацииДолжны быть полностью в верхнем регистреЭто соглашение Flask, используемое вместе с методами загрузки конфигурации.


Встроенные элементы конфигурации

Flask имеет большое количество встроенных элементов конфигурации для управления поведением фреймворка. Ниже приведены наиболее часто используемые при разработке:

Элемент конфигурации Type Значение по умолчанию Описание
DEBUG bool Отсутствует Включать ли режим отладки (должно быть False в production)
TESTING bool False Включать ли тестовый режим
SECRET_KEY str Отсутствует Секретный ключ, используемый для подписи сессии (должен быть установлен)
SERVER_NAME str Отсутствует Домен сервера + порт, например "example.com:5000"
MAX_CONTENT_LENGTH int Отсутствует Максимальный размер тела запроса (в байтах), используемый для ограничения загрузок
SESSION_COOKIE_NAME str "session" Имя cookie сессии
PERMANENT_SESSION_LIFETIME timedelta 31 день Срок действия постоянной сессии

Загрузка из файла Python — from_pyfile

Наиболее распространённая практика — записывать конфигурацию в отдельный файл Python и затем загружать его:

# 文件路径: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:

# 文件路径: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

Загрузка из переменных окружения——from_prefixed_env

Загрузка из переменных окружения — рекомендуемая практика 12-Factor App, лучше всего подходит для развертывания в production.

Flask по умолчанию читает переменные окружения с префиксомFLASK_, и будет предпринята попытка разобрать значения как тип JSON:

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

Код 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_ 前缀的变量

Вложенная конфигурация

Использование двойных подчёркиваний__Вложенную конфигурацию можно задать:

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

Результат после загрузки:

Пример

app.config.from_prefixed_env()
# Значение config["DATABASE"] — {"host": "localhost", "port": 5432}
print(app.config["DATABASE"])  # Вывод: {'host': 'localhost', 'port': 5432}

Загрузка из JSON/TOML — from_file

Помимо файлов Python и переменных среды, Flask также поддерживает загрузку конфигурации из таких форматов, как JSON и TOML:

Пример

// Путь к файлу: config.json
{
  "SECRET_KEY": "example-secret",
  "DATABASE_URL": "sqlite:///example.db",
  "ITEMS_PER_PAGE": 20
}

Пример

import json

app = Flask(__name__)

# Загрузить из файла JSON (text=True указывает текстовый режим, по умолчанию True)
app.config.from_file("config.json", load=json.load)
# Загрузить из файла TOML (требуется tomllib или tomli)
# import tomllib
# app.config.from_file("config.toml", load=tomllib.load, text=False)

Загрузка из объекта——from_object

Загрузить все атрибуты в верхнем регистре напрямую из объекта Python (модуля или класса):

Пример

# Рекомендуемая практика: определяйте классы конфигурации для различения окружений
class Config:
    SECRET_KEY = "dev-key"
    DATABASE = "dev.db"

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

class DevelopmentConfig(Config):
    DEBUG = True

# Выбор конфигурации на основе переменных окружения
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)

Папка instance — приватная конфигурация

Некоторые конфигурации не подходят для коммита в репозиторий кода (например, секретные ключи production). Их можно разместитьinstanceв папке:

Пример

app = Flask(__name__, instance_relative_config=True)

# Загрузить instance/config.py (этот файл не коммитится в Git)
app.config.from_pyfile("config.py", silent=True)

# Папка instance обычно находится в отдельном месте вне каталога проекта
myflaskapp/
├── app.py
├── config.py         # 公共配置(可提交到 Git)
└── instance/          # 不提交到 Git(.gitignore)
    └── config.py     # 私密配置(密钥等)

Приоритет загрузки конфигурации

Обычный порядок загрузки конфигурации на практике:

Пример

app = Flask(__name__)

# 1. Загрузить конфигурацию по умолчанию (жёстко закодированные значения по умолчанию в коде)
app.config.update({
    "ITEMS_PER_PAGE": 20,
    "MAX_CONTENT_LENGTH": 16 * 1024 * 1024,
})

# 2. Загрузка конфигурации экземпляра (instance/config.py, приоритет выше, чем у значений по умолчанию)
app.config.from_pyfile("config.py", silent=True)

# 3. Загрузка переменных окружения (наивысший приоритет, переопределяет все предыдущие настройки)
app.config.from_prefixed_env()

Такая расстановка приоритетов обеспечивает: значения по умолчанию — самые слабые, конфигурация из файла — средняя, а переменные окружения — самые сильные, что соответствует лучшим практикам 12-Factor App.

Другие расширения