0

我相信我遇到了与此处 和此处找到的问题类似的问题

要点是我在 Amazon-ec2 实例上运行带有通道的 Django 应用程序,并且 websocket 无法连接。

我关于 websockets 的大部分代码都来自这里的 django-channels 教程。

通过应用程序负载均衡器后面的安全 dns 名称引导流量。

我完全在 Daphne 上运行它(处理 https 和 websocket 流量),配置非常少:

daphne -b <server_url> -p <port> test_app.asgi:application

我还使用mozilla-django-oidc模块通过 openID-connect 进行身份验证。但是对于 websocket 测试,我不期待身份验证。我觉得有必要指出这个问题是否与 websocket 身份验证有关。

在开发中,我正在运行一个本地 redis 集群作为我的通道层。我的开发应用程序(所有 http:// 和 ws://)连接到 websocket 没有问题。聊天应用程序按预期工作。我可以连接到我的 websockets 并通过

127.0.0.1:60779 - - [07/Apr/2021:12:06:05] "WSCONNECTING /ws/chat/lobby/"

这是 asgi.py 中的代码

import chat.routing

asgi_app = get_asgi_application()
from channels.auth import AuthMiddlewareStack

application = ProtocolTypeRouter(
   {
       "http": asgi_app,
       "websocket": AuthMiddlewareStack(
           URLRouter(chat.routing.websocket_urlpatterns)
       ),
   }
)

以及 chat/routing.py 中的代码

from django.urls import re_path

from . import consumers

websocket_urlpatterns = [
    re_path(r'ws/chat/(?P<room_name>\w+)/$', consumers.ChatConsumer.as_asgi()),
]

在生产中,我使用 elasticache redis 集群作为我的通道层。我可以在 django shell 中测试它,它连接/发送/接收。

但是在生产聊天中,我无法到达房间或看到上面的WSCONNECTING消息。它永远不会升级到 websocket 的连接。之后的下一个日志是

2021-04-07 16:15:15,279 WARNING  Not Found: /ws/chat/lobby/

就像它试图将该路由解析为 http 而不是 websocket 一样。

在做了一些额外的阅读之后,我尝试使用在 Daphne 上运行的主机/端口,比如

wss://<my host ip>:<port>/ws/chat/lobby

这并没有导致立即失败,但最终从未连接。

(index):46 Uncaught DOMException: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.

这是chrome中的错误 在此处输入图像描述

我觉得这与在 websocket url 中用作主机名的面向公众的主机名有关。允许所有入站流量。我不确定这与手头的问题有何关系。

我仍在努力学习如何解决这一切。任何建议都将不胜感激。

谢谢!

4

1 回答 1

0

我只是通过相同的教程运行,我得到了同样的错误。我决定看看这里导入的方法:

从 channels.routing 导入 ProtocolTypeRouter, URLRouter

我找不到他们。所以我卸载了 django-channels 并安装了频道

python3 -m pip 卸载 django-channels && python3 -m pip 安装频道

和东西工作。

于 2021-06-26T09:50:52.300 回答