Объединенный класс настроек Pydantic из нескольких классов настроек с отдельными файлами среды.Python

Программы на Python
Ответить
Anonymous
 Объединенный класс настроек Pydantic из нескольких классов настроек с отдельными файлами среды.

Сообщение Anonymous »

Предположим, у меня есть два простых класса BaseSettings, каждый из которых загружает значения из своих отдельных файлов среды. Допустим также, что существует комбинированный класс настроек, основанный на первых двух классах.
Settings = DatabaseSettigns + AuthSettings
Как создать комбинированный класс настроек с плоским пространством имен без необходимости создания динамического класса или динамического назначения значений атрибутов, т. е. я хочу, чтобы моя IDE могла выполнять автозаполнение и т. д., зная, что это за атрибуты.
Когда я использую приведенный ниже пример, я получаю ТОЛЬКО значения из ПОСЛЕДНЕГО класса, т. е. AuthSettings, а не ОБА из их.
Как сделать так, чтобы ВСЕ классы настроек компонентов правильно считывались/инициализировались из соответствующих файлов?
import logging
log = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO,
format='%(message)s')

from pydantic import BaseModel
from pydantic_settings import BaseSettings, SettingsConfigDict

class DatabaseSettings(BaseSettings):
model_config = SettingsConfigDict(
env_prefix="APP_",
env_file=".env.database",
env_file_encoding="utf-8",
extra="ignore",
)
db_host: str = "localhost"

class AuthSettings(BaseSettings):
model_config = SettingsConfigDict(
env_prefix="APP_",
env_file=".env.auth",
env_file_encoding="utf-8",
extra="ignore",
)
auth_secret_key: str = "change-me"

class Settings(DatabaseSettings, AuthSettings):
model_config = SettingsConfigDict(
env_prefix='APP_',
extra='ignore'
)
pass

settings = Settings()
log.info(f"Settings: {settings}")


# .env.database
APP_DB_HOST=db.example.com

# .env.auth
APP_AUTH_SECRET_KEY=secret-from-env-file

Текущий результат
Settings: auth_secret_key='secret-from-env-file' db_host='localhost'

Желаемый результат
Settings: auth_secret_key='secret-from-env-file' db_host='db.example.com'
# notice how the db_host value is the one read from the file instead of the default "localhost"


Подробнее здесь: https://stackoverflow.com/questions/798 ... individual
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»