Друзья, пожалуйста, подскажите. <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: а вообще вот в документации есть пример, как это грамотно сделать