Релиз: Оптимизация и переработка системы сессий
Описание:
В данном релизе реализованы значительные улучшения в структуре и работе с сессиями для базы данных. Основные изменения связаны с переносом универсальных методов в новый модуль dao
, реорганизацией пакетов, улучшением конфигурации и созданием нового универсального класса для управления сессиями.
Основные изменения:
1. Структура пакета dao
- Универсальные методы перенесены в отдельный пакет
dao
, который теперь стал полноценным модулем. Структураdao
выглядит следующим образом:app/dao/__init__.py
app/dao/database.py
— содержит базовый классBase
, упрощённые методы и модели базы данных.app/dao/base.py
— содержит базовый классBaseDao
, в котором прописаны универсальные методы для работы с таблицами базы данных.app/dao/session_maker.py
— новый файл для управления сессиями, поддерживающий FastAPI и Telegram ботов.
2. Новый класс DatabaseSessionManager
- Реализован в
app/dao/session_maker.py
как универсальный класс для управления сессиями базы данных. - Основные возможности:
- Управление сессиями как с использованием зависимостей FastAPI (
Depends
), так и в виде декораторов для более гибкого использования. - Поддержка транзакций: автоматический коммит и откат при ошибках.
- Примеры использования:
- Зависимость для FastAPI с поддержкой и без поддержки транзакций.
- Декоратор для методов с возможностью настройки уровня изоляции транзакции и коммита, что может быть полезно в телеграм-ботах и других функциях.
- Управление сессиями как с использованием зависимостей FastAPI (
# Использование зависимости FastAPI с транзакциями
@router.post("/register/")
async def register_user(user_data: SUserRegister, session: AsyncSession = TransactionSessionDep):
# Логика эндпоинта
pass
# Пример использования декоратора
@session_manager.connection(isolation_level="SERIALIZABLE", commit=True)
async def example_method(*args, session: AsyncSession, **kwargs):
# Логика метода
pass
3. Оптимизация и рефакторинг BaseDao
в app/base.py
- В
BaseDao
теперь используются только операцииflush
вместоcommit
, что повышает контроль над транзакциями и позволяет избежать избыточных коммитов. - Добавлены улучшенные универсальные методы для работы с объектами базы данных.
4. Обновление конфигурации app/config.py
- Выделена переменная
BASE_DIR
для удобства доступа к базовым ресурсам проекта, включая базу данных SQLite. - Новая структура конфигурации позволяет получать доступ к переменным окружения независимо от места запуска.
import os
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
BASE_DIR: str = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
DB_URL: str = f"sqlite+aiosqlite:///{BASE_DIR}/data/db.sqlite3"
SECRET_KEY: str
ALGORITHM: str
model_config = SettingsConfigDict(env_file=f"{BASE_DIR}/.env")
settings = Settings()
database_url = settings.DB_URL
Преимущества обновления:
- Упрощённое управление сессиями: Новая структура позволяет легко переключаться между сессиями с транзакциями и без них, в зависимости от контекста.
- Гибкость: Универсальный класс
DatabaseSessionManager
предоставляет несколько способов использования, включая декораторы и зависимости, что делает его подходящим для разных проектов и целей. - Модульность и поддерживаемость: Перенос методов в
dao
делает код более организованным и лёгким для поддержки.
Изменения уже доступны в проекте и готовы к использованию.
Full Changelog: https://github.com/Yakvenalex/FastApiWithAuthSample/commits/v1.0.1