Проблема:
- 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 - успешно
21 lines
947 B
Python
21 lines
947 B
Python
from django.conf import settings
|
||
from django.conf.urls.static import static
|
||
from django.contrib import admin
|
||
from django.urls import include, path
|
||
|
||
# Импорт Service Worker view из приложения notifications
|
||
from notifications.views import serve_service_worker
|
||
|
||
urlpatterns = [
|
||
path("admin/", admin.site.urls),
|
||
path("api/", include(("api.urls", "api"), namespace="api")),
|
||
# Service Worker должен быть в корне для правильного scope
|
||
path("sw.js", serve_service_worker, name="sw"),
|
||
# django-filer URLs для обработки приватных файлов (с проверкой прав доступа)
|
||
path("", include("filer.server.urls")),
|
||
]
|
||
|
||
# Публичные медиа файлы (без проверки прав) - только в режиме разработки
|
||
if settings.DEBUG:
|
||
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|