Проблема:
- Service Worker файл (sw.js) находился в корне backend/
- Hardcoded пути к иконкам в sw.js и push.py (/static/img/logo-192.png)
- Функция serve_service_worker() в главном urls.py проекта
- Зависимость от project-specific структуры
- Невозможность переиспользовать приложение без изменений
Решение:
Service Worker на месте:
- backend/notifications/static/notifications/sw.js
- backend/notifications/views.py - serve_service_worker()
- backend/notifications/urls.py - добавлен endpoint sw.js
- backend/eusrr_backend/urls.py - импорт view из notifications
Удаление hardcoded путей:
- sw.js: убрана константа icon='/static/img/logo-192.png'
- senders/push.py: убран hardcoded 'icon': '/static/img/logo.png'
- config.py: добавлены PUSH_DEFAULT_ICON, PUSH_DEFAULT_BADGE (None = browser default)
- README.md: документация по настройке через NOTIFICATIONS_CONFIG
Изменения:
- Создан: notifications/views.py с serve_service_worker()
- Создан: notifications/static/notifications/sw.js
- Изменен: notifications/urls.py - добавлен path('sw.js')
- Изменен: notifications/config.py - настройки иконок
- Изменен: notifications/senders/push.py - использование config
- Изменен: notifications/README.md - документация
- Упрощен: eusrr_backend/urls.py - удалена функция, добавлен импорт
- Удалены: backend/sw.js, backend/static/sw.js, backend/communications/sw.js
Преимущества:
- ✅ Полностью автономное приложение
- ✅ Нет зависимостей от структуры проекта
- ✅ Конфигурируемые иконки через settings.py
- ✅ Browser defaults если иконки не указаны
- ✅ Легко переносить между проектами
- ✅ Единообразие архитектуры (SRP)
Верификация:
- python manage.py check - успешно
44 lines
1.6 KiB
Python
44 lines
1.6 KiB
Python
"""
|
||
Views для приложения notifications.
|
||
|
||
Обслуживание Service Worker и других статических ресурсов.
|
||
"""
|
||
from django.http import FileResponse, HttpResponse
|
||
from pathlib import Path
|
||
|
||
|
||
def serve_service_worker(request):
|
||
"""
|
||
Обслуживает Service Worker для Web Push уведомлений.
|
||
|
||
Service Worker должен отдаваться с правильными заголовками:
|
||
- content-type: application/javascript
|
||
- Cache-Control: no-cache (всегда свежая версия)
|
||
- Service-Worker-Allowed: / (контроль всего домена)
|
||
"""
|
||
sw_path = Path(__file__).parent / 'static' / 'notifications' / 'sw.js'
|
||
|
||
try:
|
||
response = FileResponse(
|
||
open(sw_path, 'rb'),
|
||
content_type='application/javascript; charset=utf-8',
|
||
status=200
|
||
)
|
||
# Отключаем кэширование для sw.js (всегда получаем свежую версию)
|
||
response['Cache-Control'] = 'no-cache, no-store, must-revalidate'
|
||
response['Pragma'] = 'no-cache'
|
||
response['Expires'] = '0'
|
||
# Service-Worker-Allowed позволяет контролировать весь домен
|
||
response['Service-Worker-Allowed'] = '/'
|
||
return response
|
||
except FileNotFoundError as e:
|
||
return HttpResponse(
|
||
f"Service Worker not found: {sw_path}",
|
||
status=500
|
||
)
|
||
except Exception as e:
|
||
return HttpResponse(
|
||
f"Error serving Service Worker: {e}",
|
||
status=500
|
||
)
|