С чем связана ошибка, возникающая в Pydantic Settings?

Друзья, пожалуйста, подскажите. <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
  • 30 октября 2024 г. 9:22
Ответы на вопрос 2
Ваш код настроек 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: а вообще вот в документации есть пример, как это грамотно сделать
Похожие вопросы