ASGI/DJANGO - WebSocket запросы улетают в urls.py, вместо routing.py
Бьюсь с добавлением чата на Django сайт. Сайт работает на Daphne с Apache2 в качестве обратного прокси. Проблема в следующем, при попытке подключиться к WebSocket получаю такую ошибку:
WebSocket connection to 'wss://website/ws/adminChat/' failed:
Заметил такую штуку, что ASGI.py не обрабатывает WebSocket. Я поясню, мой ASGI.py файл выглядит так:
import os
from django.core.asgi import get_asgi_application
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from myproject.routing import websocket_urlpatterns
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket" : AuthMiddlewareStack(
URLRouter(
websocket_urlpatterns
)
),
})
routing.py выглядит так:
from django.urls import re_path
from . import consumers
websocket_urlpatterns = [
re_path(r'^ws/adminChat/$', consumers.adminChatConsumer.as_asgi()),
]
Если я запускаю Daphne с таким конфигом просто получаю ошибку, о том что WebSocket закрыт, но если я помещаю эту строку в urls.py:
urlpatterns = [
re_path(r'^ws/adminChat/$', consumers.adminChatConsumer.as_asgi())
]
То получаю ошибку:
TypeError: adminChatConsumer() missing 2 required positional arguments: 'receive' and 'send'
Но это не важно, таким образом, я понял, что запросы от WebSocket, обрабатываемые в ASGI.py летят не в routing.py ('websocket)', а в urls.py('http'). Буду благодарен за любые советы, готов скинуть любые данные из файлов моего проекта.
Ответы (1 шт):
Нашел решение проблемы. Она заключалась в некорректных настройках Apache2. После внесения изменений в конфигурационный файл Apache2 (/etc/apache2/sites-enabled/default-ssl.conf) проблема была решена.
Проверьте, что у вас включены необходимые моды Apache2:
• sudo a2enmod proxy
• sudo a2enmod proxy_http
• sudo a2enmod proxy_wstunnel
• sudo a2enmod rewrite или можно использовать sudo a2enmod rewrite && sudo service apache2 restart - после внесения изменений (описаны ниже) в конфигурационный файл.
Внесенные изменения в конфигурационный файл Apache2:
<VirtualHost *:443>
ServerName mySiteName
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://mySiteIp:sitePort/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*) http://mySiteIp:sitePort/$1 [P,L]
ProxyPassReverse / http://mySiteIp:sitePort/
...