> Как структурировать уведомления (Python)
Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы
Компании: Международный аэропорт Шереметьево
Стек: Python
> Пример ответа
Для структурирования уведомлений в бэкенде на Python я предлагаю использовать паттерн "Стратегия" в сочетании с фабрикой каналов доставки. Основная идея - разделить логику генерации уведомлений, их форматирования и отправки.
Пример реализации:
PYTHONfrom abc import ABC, abstractmethodfrom dataclasses import dataclassfrom enum import Enumfrom typing import List, Optionalclass NotificationType(Enum):EMAIL = "email"SMS = "sms"PUSH = "push"@dataclassclass Notification:recipient: strtitle: strbody: strtype: NotificationTypemetadata: Optional[dict] = Noneclass NotificationChannel(ABC):@abstractmethoddef send(self, notification: Notification) -> bool:passclass EmailChannel(NotificationChannel):def send(self, notification: Notification) -> bool:# Логика отправки email через SMTP/APIprint(f"Sending email to {notification.recipient}: {notification.title}")return Trueclass SMSChannel(NotificationChannel):def send(self, notification: Notification) -> bool:# Логика отправки SMS через сторонний сервисprint(f"Sending SMS to {notification.recipient}: {notification.body}")return Trueclass PushChannel(NotificationChannel):def send(self, notification: Notification) -> bool:# Логика отправки push-уведомления через Firebase/APNsprint(f"Sending push to {notification.recipient}: {notification.title}")return Trueclass NotificationService:def __init__(self):self.channels = {NotificationType.EMAIL: EmailChannel(),NotificationType.SMS: SMSChannel(),NotificationType.PUSH: PushChannel(),}def send_notification(self, notification: Notification) -> bool:channel = self.channels.get(notification.type)if not channel:raise ValueError(f"Unsupported notification type: {notification.type}")return channel.send(notification)def send_bulk(self, notifications: List[Notification]) -> List[bool]:results = []for notif in notifications:results.append(self.send_notification(notif))return results
Ключевые принципы:
- Единая структура данных - класс
Notificationинкапсулирует все поля. - Интерфейс канала - каждый канал реализует
send(), что упрощает добавление новых типов (Telegram, Slack). - Фабрика каналов -
NotificationServiceвыбирает нужный канал по типу. - Расширяемость - для добавления нового канала достаточно создать класс и зарегистрировать его в словаре.
Для сложных сценариев (шаблоны, приоритеты, очереди) можно добавить:
- Шаблонизатор (Jinja2) для генерации тела уведомления.
- Очередь задач (Celery/RQ) для асинхронной отправки.
- Логирование и мониторинг через декораторы или middleware.
> Похожие задачи по Python
Был ли опыт работы с инцидентами на продакшене и как решал баги
Как реализовать приоритеты в микросервисе рассылки уведомлений
Откуда брать данные для уведомлений
Как организовать подключение к Zabbix
> Похожие задачи по backend
Был ли опыт работы с инцидентами на продакшене и как решал баги
Как реализовать приоритеты в микросервисе рассылки уведомлений
Откуда брать данные для уведомлений
Как организовать подключение к Zabbix
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью