Skip to content

Найстройки и Переменные Окружения

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

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

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
from pydantic_settings import BaseSettings

class Settings(BaseSettings):
    url: str = ""
    queue: str = "test-queue"

settings = Settings()

Info

В Pydantic v1 вы можете импортировать BaseSettings прямо из pydantic вместо pydantic_settings.

config.py
1
2
3
4
5
6
7
from pydantic import BaseSettings

class Settings(BaseSettings):
    url: str = ""
    queue: str = "test-queue"

settings = Settings()

Затем, создайте объект класса Settings, Pydantic прочитает переменные окружения (регистронезависимо), так что, переменные вроде APP_NAME будут распознаны как поле app_name вашего класса.

Затем Pydantic провалидирует полученные значения, поэтому ваши строковые значения из переменных окружения будут приведены к указанному в аннотации Settins типу.

Используйте settings

Теперь вы можете использовать объект settings в вашем приложении:

serve.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from propan import PropanApp
from propan.rabbit import RabbitBroker

from config import setting

broker = RabbitBroker(settings.url)
app = PropanApp(broker)

@broker.handle(settings.queue)
async def handler(msg):
    ...

Запустите приложения

Теперь вы можете запустить ваше приложение с указанием переменных окружения, например 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
import os

class Settings(BaseSettings):
    url: str
    queue: str = "test-queue"

settings = Settings(_env_file=os.getenv("ENV", ".env"))

Так вы сможете указывать, какой именно .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