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 шт):

Автор решения: Djony Cooper

Нашел решение проблемы. Она заключалась в некорректных настройках 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/
        ...
→ Ссылка