Управление конфигурацией во Flask
Любому приложению нужна конфигурация — адреса баз данных, ключи, переключатели режима отладки и так далее.
Flask предоставляет гибкую систему конфигурации, которая поддерживает загрузку конфигурации из нескольких источников, чтобы удовлетворить различные потребности при разработке и в продакшене.
Основы объекта конфигурации
Конфигурация приложения Flask хранится вapp.configОн похож на словарь, и можно читать и записывать любое значение конфигурации по имени ключа:
Пример
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"
Результат после загрузки:
Пример
# Значение config["DATABASE"] — {"host": "localhost", "port": 5432}
print(app.config["DATABASE"]) # Вывод: {'host': 'localhost', 'port': 5432}
Загрузка из JSON/TOML — from_file
Помимо файлов Python и переменных среды, Flask также поддерживает загрузку конфигурации из таких форматов, как JSON и TOML:
Пример
{
"SECRET_KEY": "example-secret",
"DATABASE_URL": "sqlite:///example.db",
"ITEMS_PER_PAGE": 20
}
Пример
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в папке:
Пример
# Загрузить instance/config.py (этот файл не коммитится в Git)
app.config.from_pyfile("config.py", silent=True)
# Папка instance обычно находится в отдельном месте вне каталога проекта
myflaskapp/
├── app.py
├── config.py # 公共配置(可提交到 Git)
└── instance/ # 不提交到 Git(.gitignore)
└── config.py # 私密配置(密钥等)
Приоритет загрузки конфигурации
Обычный порядок загрузки конфигурации на практике:
Пример
# 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.
Другие расширения