/
outthevoid
/
python_microblogging_service_project
Обзор
Документация
Войти
/
outthevoid
/
python_microblogging_service_project
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
app/config.py
142 строки
6 KB
VladimirChukavin
Revert "Вернул проект в исходное состояние."
07 апр 2026, 14:01
07 апр 2026, 14:01
7531b60
Код
Авторство
О чём код?
from functools import lru_cache from typing import Literal from pydantic import Field from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): """ Конфигурация приложения и параметров подключения к базе данных. Класс загружает значения настроек из переменных окружения и файла ``.env`` в соответствии с конфигурацией ``model_config``. Значения по умолчанию можно переопределять через переменные окружения. :ivar app_name: Имя приложения. :vartype app_name: str :ivar app_version: Версия приложения. :vartype app_version: str :ivar app_env: Текущее окружение приложения (``dev`` или ``prod``). :vartype app_env: Literal["dev", "prod"] :ivar app_debug: Флаг режима отладки. :vartype app_debug: bool :ivar db_user: Имя пользователя базы данных. :vartype db_user: str :ivar db_password: Пароль пользователя базы данных. :vartype db_password: str :ivar db_name: Имя базы данных. :vartype db_name: str :ivar db_host: Хост базы данных. :vartype db_host: str :ivar db_port_number: Стандартный порт подключения к базе данных. :vartype db_port_number: int :ivar db_port: Порт подключения к базе данных. :vartype db_port: int :ivar database_url_raw: Готовая строка подключения к базе данных, если задана явно. :vartype database_url_raw: str | None :ivar media_dir: Локальный путь к директории с медиафайлами. :vartype media_dir: str :ivar media_url: Базовый URL-префикс для доступа к медиафайлам. :vartype media_url: str :ivar max_upload_size: Максимальный размер загружаемого файла в байтах. :vartype max_upload_size: int :ivar allowed_media_types: Допустимые расширения медиафайлов. :vartype allowed_media_types: tuple[str, ...] """ app_name: str = Field(default="Microblog API", alias="APP_NAME") app_version: str = Field(default="1.0.0", alias="APP_VERSION") app_env: Literal["dev", "prod"] = Field(default="dev", alias="APP_ENV") app_debug: bool = Field(default=False, alias="APP_DEBUG") db_user: str = Field(default="postgres", alias="DB_USER") db_password: str = Field(default="postgres", alias="DB_PASSWORD") db_name: str = Field(default="microblog", alias="DB_NAME") db_host: str = Field(default="microblog_db", alias="DB_HOST") db_port_number: int = 5432 db_port: int = Field(default=db_port_number, alias="DB_PORT") database_url_raw: str | None = Field(default=None, alias="DATABASE_URL") media_dir: str = Field(default="./static/images", alias="MEDIA_DIR") media_url: str = Field(default="/static/images", alias="MEDIA_URL") max_upload_size: int = Field(default=5 * 1024 * 1024, alias="MAX_UPLOAD_SIZE") allowed_media_types: tuple[str, ...] = Field( default=(".jpeg", ".jpg", ".png", ".webp", ".gif"), alias="ALLOWED_MEDIA_TYPES", ) model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", case_sensitive=False, extra="ignore", ) @property def database_url(self) -> str: """ Сформировать URL подключения к базе данных PostgreSQL. Если задана строка подключения ``database_url_raw``, то возвращается она. В противном случае URL формируется из параметров доступа к базе данных (пользователь, пароль, хост, порт и имя базы). :returns: Строка подключения к БД в формате, совместимом с SQLAlchemy и драйвером ``asyncpg``. :rtype: str """ if self.database_url_raw: return self.database_url_raw return "postgresql+asyncpg://{:s}:{:s}@{:s}:{:d}/{:s}".format( self.db_user, self.db_password, self.db_host, self.db_port, self.db_name ) @property def is_dev(self) -> bool: """ Проверить, запущено ли приложение в dev-окружении. Значение вычисляется на основе поля ``app_env`` и не зависит от флага отладки. :returns: ``True``, если приложение запущено в окружении ``dev``, иначе ``False``. :rtype: bool """ return self.app_env == "dev" @property def is_prod(self) -> bool: """ Проверить, запущено ли приложение в prod-окружении. Значение вычисляется на основе поля ``app_env`` и не зависит от флага отладки. :returns: ``True``, если приложение запущено в окружении ``prod``, иначе ``False``. :rtype: bool """ return self.app_env == "prod" @lru_cache(maxsize=1) def get_settings() -> Settings: """ Получить кэшированный экземпляр настроек приложения. Функция инициализирует объект :class:`Settings` один раз за время жизни процесса и повторно возвращает его при последующих вызовах, используя LRU-кэш с максимальным размером 1. :returns: Экземпляр настроек приложения. :rtype: Settings """ return Settings()