Конфиг fastapi-solution/src/core/config.py правильнее было оформить в виде класса:
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8')
redis_host: str = Field(..., alias='REDIS_HOST')
settings = Settings()
и затем использовать инстанс конфига setting в разных частях приложения. Плюс такого подхода в том, что происходит валидация типов переменных окружения при помощи pydantic. Также при создании инфраструктуры под тесты, можно будет наследоваться от этого класса и создать отдельный тестовый конфиг со своими переменными окружения. Подробнее https://pydantic-docs.helpmanual.io/usage/settings/
Еще небольшой пример конфига:
class Settings(BaseSettings):
project_name: str = 'Some project name'
redis_host: str = ...
redis_port: int = ...
elastic_host: str = Field(..., alias='ELASTIC_HOST_NAME')
elastic_port: int = Field(9200, alias ='ELASTIC_PORT')
BaseSettings регистронезависимый и работает вот так:
присвоит в поле project_name значение переменной PROJECT_NAME, а если ее нет, то даст значение по умолчанию 'Some project name'
redis_host мы сделали обязательным полем (... - служебный символ), если не будет переменной окружения REDIS_HOST, то проект не заведется
elastic_host мы сделали обязательным и явно указали имя переменной окружения, т.к. она отличается от имени поля
elastic_port так же как и с хостом, но указали и значение по умолчанию
Начиная с python 3.10 можно не использовать Optional из модуля typing. В новом синтаксисе можно использовать вот такую конструкцию: redis: Redis | None = None
Отлично поработали 🔥
Конфиг
fastapi-solution/src/core/config.py
правильнее было оформить в виде класса:и затем использовать инстанс конфига setting в разных частях приложения. Плюс такого подхода в том, что происходит валидация типов переменных окружения при помощи pydantic. Также при создании инфраструктуры под тесты, можно будет наследоваться от этого класса и создать отдельный тестовый конфиг со своими переменными окружения. Подробнее https://pydantic-docs.helpmanual.io/usage/settings/
Еще небольшой пример конфига:
BaseSettings регистронезависимый и работает вот так:
redis: Redis | None = None