Django Channels Worker 没有响应 websocket.connect

标签 django websocket django-channels daphne

我在使用 Django channel 时遇到问题。 Daphne 正确地接受了 WebSocket CONNECT 请求,但是工作人员没有使用 consumers.py 中提供的方法响应请求。问题是这种情况只发生在大部分时间。有时它会响应 consumers.py 中的方法,但大多数时候 worker 根本不响应。我有一个在 vagrant (trusty64) 环境中运行良好的重复代码,但代码在实际的 trusty64 机器中表现得像那样。需要注意的是,托管应用程序的 trusty64 机器还运行着其他应用程序(同时运行大约 4 个应用程序)。

我有一个像这样设置的routing.py

from channels import route
from app.consumers import connect_tracking, disconnect_tracking

channel_routing = [

    route("websocket.connect", connect_tracking, path=r'^/websocket/tms/tracking/stream/$'),
    route("websocket.disconnect", disconnect_tracking, path=r'^/websocket/tms/tracking/stream/$'),
]

相应的 consumers.py 看起来像这样

import json
from channels import Group
from channels.sessions import channel_session
from channels.auth import http_session_user, channel_session_user, channel_session_user_from_http

from django.conf import settings

@channel_session_user_from_http
def connect_tracking(message):
    group_name = settings.TRACKING_GROUP_NAME
    print "%s is joining %s" % (message.user, group_name)
    Group(group_name).add(message.reply_channel)

@channel_session_user
def disconnect_tracking(message):
    group_name = settings.TRACKING_GROUP_NAME
    print "%s is joining %s" % (message.user, group_name)
    Group(group_name).discard(message.reply_channel)

settings.py中的一些 channel 相关的行

redis_host = os.environ.get('REDIS_HOST', 'localhost')
CHANNEL_LAYERS = {
    "default": {
        # This example app uses the Redis channel layer implementation asgi_redis
        "BACKEND": "asgi_redis.RedisChannelLayer",
        "CONFIG": {
            "hosts": [(redis_host, 6379)],
        },
        "ROUTING": "tms_app.routing.channel_routing",
    },
}

引用另一个 question ,我试过像这样运行 daphne 和 worker

daphne tms_app.asgi:channel_layer --port 9015 --bind 0.0.0.0 -v2
python manage.py runworker -v3

我抓到了daphne和worker的日志,是这样的

达芙妮日志:

2016-12-30 17:00:18,870 INFO     Starting server at 0.0.0.0:9015, channel layer tms_app.asgi:channel_layer
2016-12-30 17:00:26,788 DEBUG    WebSocket open for websocket.send!APpWONQKKDXR
192.168.31.197:48933 - - [30/Dec/2016:17:00:26] "WSCONNECT /websocket/tms/tracking/stream/" - -
2016-12-30 17:00:26,790 DEBUG    Upgraded connection http.response!sqlMPEEtolDP to WebSocket websocket.send!APpWONQKKDXR

对应的worker日志:

2016-12-30 17:00:22,265 - INFO - runworker - Running worker against channel layer default (asgi_redis.core.RedisChannelLayer)
2016-12-30 17:00:22,265 - INFO - worker - Listening on channels http.request, websocket.connect, websocket.disconnect, websocket.receive

如您所见,当出现 WSCONNECT 事件时,工作人员不会响应它。

还有一个question这与通过将 Twisted 降级到 16.2 解决的问题很接近,但它对我不起作用。

2017 年 1 月 3 日更新

尽管对 nginx、supervisor、gunicorn 和 daphne 使用了相同的代码和相同的设置,但我无法在本地 vagrant 机器上重现该问题。我尝试更改 channel 层设置,因此它使用 IPC 而不是 redis,并且可以正常工作。这是设置:

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "asgi_ipc.IPCChannelLayer",
        "ROUTING": "tms_app.routing.channel_routing",
        "CONFIG": {
            "prefix": "tms",
        },
    },
}

然而,这并没有解决当前的问题,因为我打算使用 Redis channel 层,因为与 IPC 相比,它更容易扩展。这是否意味着我的 Redis 服务器有问题?

最佳答案

我认为您的连接未完成的原因是因为您没有像这样发送接受消息: message.reply_channel.send({'accept': True})

这适用于我的 Channels 版本,但您应该检查您的版本的文档以确保什么适用于您

关于Django Channels Worker 没有响应 websocket.connect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41394318/

相关文章:

sockets - Dart 中的 Echo WebSocket

python - 部署后在 Django 中使用 scipy.stats.stats

django - 如何在 Wagtail 中使用 RadioSelect 在管理页面上创建 ManyToOne?

mysql - 在 django 模型中存储时区的假设?

django - 在管理员中使 django-parler 字段可排序的首选方法

node.js - socket io admin ui不显示所有信息

c - 重新连接用 C 编写的 websocket 客户端

django - 无法通过 group_send 向 Django channel 发送消息

python - PytestDeprecationWarning 在测试设置 : the funcargnames attribute was an alias for fixturenames

python - Heroku 上带有 Redis 设置的 Django channel 内存泄漏