Найстройки и Переменные Окружения¶
В большинстве случаев вашему приложению необходимы внешние настройки или конфигурация, например, данные для подключения к брокеру сообщений или базе данных.
Для этих целей обычно используют переменные окружения, которые затем потребляются вашим приложением и используются для настройки.
Pydantic Settings¶
К счастью, Pydantic предоставляет возможность захватывать переменный окружения и использовать их для настроек Pydantic: Settings management.
Install pydantic-settings¶
Для начала установите pydantic-settings:
$ pip install pydantic-settings
---> 100%
Info
В Pydantic v1 эти настройки включены в состав основного пакета. Но сейчас они поставляются как отдельный пакет, так что вы можете выбрать, нужна вам эта функиональность или нет.
Создайте объект Settings¶
Импортируйте BaseSettings из Pydantic и создайте его наследника, также как вы это делаете для Pydantic BaseModel.
Точно также вы можете объявить атрибуты класса с их аннотацией и значениями по умолчанию.
Вы можете использовать те же самые преимущества и инструмента для валидации, что и для Pydantic моделей, например, валидация с помощью Field().
| config.py | |
|---|---|
1 2 3 4 5 6 7 | |
Info
В Pydantic v1 вы можете импортировать BaseSettings прямо из pydantic вместо pydantic_settings.
| config.py | |
|---|---|
1 2 3 4 5 6 7 | |
Затем, создайте объект класса Settings, Pydantic прочитает переменные окружения (регистронезависимо), так что, переменные вроде APP_NAME будут распознаны как поле app_name вашего класса.
Затем Pydantic провалидирует полученные значения, поэтому ваши строковые значения из переменных окружения будут приведены к указанному в аннотации Settins типу.
Используйте settings¶
Теперь вы можете использовать объект settings в вашем приложении:
| serve.py | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 | |
Запустите приложения¶
Теперь вы можете запустить ваше приложение с указанием переменных окружения, например URL:
$ URL="amqp://guest:guest@localhost:5672" propan run serve:app
Tip
Для установки нескольких переменных окружения для одной просто разделите их пробелом и поместите перед самой командой.
Чтение .env файла¶
Если у вас есть множество настроек, которые необходимо изменять, или просто несколько наборов окружений, может быть полезно объединить все переменные и прочитать их из одного файла.
Эта практика достаточно распространена: все переменные окружения помещаются в файл .env, который принято называть "dotenv".
Tip
Файлы, начинающиеся с точки (.) являются скрытыми в Unix системах, например Linux и macOS.
Но "dotenv" не обязательно должен иметь такое имя.
Pydantic имеет поддержку чтения настроек из таких файлов через установку внешней зависимости python-dotenv. Мы можете прочитать об этом больше в документации Pydantic Settings: Dotenv (.env) support.
Tip
Для того, чтобы это работало, установите pip install python-dotenv.
Файл .env¶
Представим файл .env следующего содержания:
URL="amqp://guest:guest@localhost:5672"
QUEUE="test-queue"
Читаем данные из .env¶
Обновите ваш config.py следующим образом:
1 2 3 4 5 6 7 | |
Так вы сможете указывать, какой именно .env файл использовать прямо из вашего терминала. Это может быть очень полезно при тестировании или развертывании приложения на продакшене.
Note
В нашем случае Pydantic пытается найти .env файл по умолчанию, но ошибки не возникнет, если такого файла нет. Pydantic просто использует значения ваших полей по умолчанию.
Вабор .env file at start¶
Теперь вы можете выбирать различные файлы настроек прямо при запуске вашего приложения:
$ ENV=.local.env propan run serve:app
Или, например, настройки для продакшена
$ ENV=.production.env propan run serve:app
Или даже тестовое окружение
$ ENV=.test.env pytest