Друзья, пожалуйста, подскажите. <br/> <br/> Я хочу структурировать конфигурацию Pydantic, разбив её на классы, для улучшения читаемости и чистоты кода, но встречаю ошибку, связанную с отсутствием поля `prefix` или может значением. <br/> <br/> Вот текст ошибки: <br/> <br/> <blockquote><br/> pydantic_core._pydantic_core.ValidationError: 1 validation error for APISettings<br/> prefix<br/> Field required [type=missing, input_value={}, input_type=dict]<br/> Для получения дополнительной информации посетите <a href="https://errors.pydantic.dev/2.9/v/missing" rel="nofollow">https://errors.pydantic.dev/2.9/v/missing</a><br/> </blockquote> <br/> <br/> Вот мой код конфигурации: <br/> <br/> <pre><code class="python">from pydantic import BaseModel, FilePath, StrictStr, PositiveInt from pydantic_settings import BaseSettings class APISettings(BaseModel): prefix: StrictStr class Config: env_prefix = "API_" class PostgresSettings(BaseModel): url: StrictStr class Config: env_prefix = "POSTGRES_" class AuthJWTSettings(BaseModel): private_key_path: FilePath public_key_path: FilePath algorithm: StrictStr access_token_expire_minutes: PositiveInt class Config: env_prefix = "AUTH_" class RedisSettings(BaseModel): url: StrictStr ttl: PositiveInt class Config: env_prefix = "REDIS_" class Settings(BaseSettings): api: APISettings = APISettings() postgres: PostgresSettings = PostgresSettings() auth: AuthJWTSettings = AuthJWTSettings() redis: RedisSettings = RedisSettings() class Config: env_file = ".env" env_file_encoding = "utf-8" extra = "ignore" settings = Settings()</code></pre> <br/> <br/> А вот содержимое файла .env: <br/> <br/> <pre><code># FROM .ENV IMPORT TO PYDANTIC SETTINGS
Ваш код настроек Pydantic выглядит в целом правильно, однако ошибка, которую вы получаете, указывает на то, что поле `prefix` в классе `APISettings` не заполнено. Это происходит, когда вы инициализируете класс `Settings`, но не передаете значения средовых переменных, которые соответствуют полям настроек. Поскольку вы используете `BaseSettings`, Pydantic ожидает, что значения будут заданы через переменные окружения, которые соответствуют префиксам, указанным в классах конфигурации. В вашем случае необходимо, чтобы в файле `.env` была определена переменная `API_PREFIX`, поскольку вы указали `env_prefix = "API_"` в классе `APISettings`. ### Пример содержимого файла `.env` Для того чтобы ошибка исчезла, добавьте переменную `API_PREFIX` (или ту, которая соответствует вашему ожиданию) в файл `.env`. Пример: ```env API_PREFIX=/api POSTGRES_URL=postgres://user:password@localhost/dbname AUTH_PRIVATE_KEY_PATH=/path/to/private/key AUTH_PUBLIC_KEY_PATH=/path/to/public/key AUTH_ALGORITHM=HS256 AUTH_ACCESS_TOKEN_EXPIRE_MINUTES=30 REDIS_URL=redis://localhost:6379/0 REDIS_TTL=3600 ``` ### Как это работает 1. **Проверьте, что .env файл доступен**, и все переменные окружения указаны правильно. 2. **Проверьте соответствие названий переменных окружения** параметрам в ваших классах. В вашем случае, они должны начинаться с `API_`, `POSTGRES_`, `AUTH_` и `REDIS_` соответственно. Когда вы будете инициализировать `Settings()`, Pydantic попытается считать значения из переменных окружения и инициализировать поля ваших классов. Если вы всё равно сталкиваетесь с ошибками после внесения этих изменений, проверьте: - Правильность названий всех переменных окружения в файле `.env`. - Есть ли ошибки в других областях кода, которые могут вызывать проблемы.
Все классы надо наследовать от BaseSettings, потому что в BaseModel нет такого параметра класса, как env_prefix. А вот Settings в таком случае надо наследовать от BaseModel
(Этот способ скорее костыль, первое что пришло в голову)
UPD: а вообще вот в документации есть пример, как это грамотно сделать