Django Channels Worker没有响应websocket.connect

时间:2016-12-30 10:07:36

标签: django websocket django-channels daphne

我遇到了django频道的问题。 Daphne正确接受WebSocket CONNECT请求,但工作人员不会使用 consumers.py 中提供的方法响应请求。事情是这种情况只发生在大部分时间。有时它会使用 consumers.py 中的方法进行响应,但大多数时候工作者根本没有响应。我有一个重复的代码在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 中的某些频道相关的广告

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

我已经捕获了达芙妮和工人的日志,看起来像这样

达芙妮记录:

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

相应的工作日志:

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使用相同的代码和相同的设置,我无法在本地流浪汉机器上复制该问题。我尝试更改了通道层设置,因此它使用IPC而不是redis,它可以工作。这是设置:

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

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

1 个答案:

答案 0 :(得分:0)

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

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