【问题标题】:Django channels - Echo example not workingDjango 频道 - 回声示例不起作用
【发布时间】:2016-11-09 06:42:00
【问题描述】:

我正在按照documentation site 中的说明进行操作,但我陷入了 echo 示例中,websocket 已正确创建并且已连接到服务器,但是当我向服务器发送任何内容时,我没有收到任何响应(在示例中说我应该看到一个警报窗口,其中包含我发送到套接字的相同消息,但我没有,虽然我已经更改了 console.log 的警报但仍然),我做错了什么?

settings.py 中:

INSTALLED_APPS = {
    ...
    'channels',
    'myapp',
    ...
} 

...
# Channels settings
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "asgiref.inmemory.ChannelLayer",
        "ROUTING": "myapp.routing.channel_routing",
    },
}

routing.py 中:

from channels.routing import route
from myapp.consumers import *

channel_routing = [
    route("websocket.receive", ws_receive),
]

consumers.py中:

def ws_receive(message):
    # ASGI WebSocket packet-received and send-packet message types
    # both have a "text" key for their textual data.
    message.reply_channel.send({
        "text": message.content['text'],
    })

在 asgi.py 中

import os
from channels.asgi import get_channel_layer

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")

channel_layer = get_channel_layer()

然后我运行:python manage.py runserver,在我的浏览器中,我转到服务器 url,在控制台中输入以下内容:

socket = new WebSocket("ws://" + window.location.host + "/chat/");
socket.onmessage = function(e) {
    alert(e.data);
}
socket.onopen = function() {
    socket.send("hello world");
}

同样,此时我应该会看到一个警报窗口(或 console.log 消息),但我什么也没得到。

我提出的请求处于待处理状态(尽管我阅读了here 并且第一条评论说这是正常的)

服务器输出如下所示:

每次我尝试通过浏览器中的 websocket 发送内容时,服务器只会打印 CONNECT 但没有显示来自 js 控制台的日志。

编辑:我已经在浏览器中针对 echo.websocket.org 测试了 websockets,我得到了预期的答案:

【问题讨论】:

  • +1 有同样的问题。客户端WebSocket成功连接服务端,可以从服务端接收数据,但是在调用socket.send()时,ws_receive消费者方法永远不会被调用。

标签: javascript python django websocket django-channels


【解决方案1】:

我改用旧版本的 twisted 并修复了它。小时

【讨论】:

  • +1 它确实有帮助——刚刚降级到 16.2.0 并开始按预期工作。我会在 Github 上提出这个问题。
  • 其实就是解决办法。谢谢你们!我将 Twisted 降级到 16.2.0 并且成功了。
猜你喜欢
  • 2016-12-08
  • 2015-07-19
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多