27просмотров
12 мая 2023 г.
Score: 30
Зацени модуль. Он предоставляет абстрактный класс, читай интерфейс, который обязывает дочерний класс реализовать метод _get_pagination, который выполняет основную логику по получению из СУБД данных об объектах, при этом есть публичный context, который использует _get_url для формирования URL и _get_pagination для получения объектов: from abc import ABC, abstractmethod
from typing import Dict, Any, Optional from flask import url_for
from flask_sqlalchemy import Pagination Settings = Dict[str, Any]
Url = str
Context = Settings class Paginator(ABC): @staticmethod @abstractmethod def _get_pagination(settings: Settings) -> Pagination: """Объекты постранично. Требуется реализовать этот метод в дочернем классе. """ ... @staticmethod def _get_url( path: str, page: Optional[int], settings: Settings, ) -> Url: if page: return url_for(path, **settings, page=page) return "#" @classmethod def context(cls, path: str, settings: Settings) -> Context: """Получение контекста. Основной метод, который необходимо вызывать. """ pagination = cls._get_pagination(settings) del settings["page"] del settings["max_per_page"] prev_url = cls._get_url(path, pagination.prev_num, settings) next_url = cls._get_url(path, pagination.next_num, settings) context = { "items": pagination.items, "prev_url": prev_url, "next_url": next_url, "pages": pagination.pages, "page": pagination.page, "settings": settings, } return context Получается, что основная логика по получению объектов из БД, которая будет разной для каждого случая, делегируется для реализации, при этом общий код, который одинаковый для всех, остаётся в одном месте и переиспользуется.