Django渠道工人没有响应websocket.connect

Django渠道工人没有响应websocket.connect

问题描述:

我遇到了django频道的问题。 Daphne正确接受WebSocket CONNECT请求,但工作人员不会用consumers.py中提供的方法响应请求。事情是这样的,大部分时间只有。有时它会以consumers.py中的方法进行响应,但大多数时间员工根本没有响应。我有一个在vagrant(trusty64)环境中工作正常的重复代码,但代码的行为与实际的trusty64机器相似。应该指出的是,承载应用程序的trusty64机器还有其他应用程序正在运行(大约4个应用程序同时运行)。Django渠道工人没有响应websocket.connect

我有一个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) 

和一些渠道相关线路.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 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接近这个问题,解决了降级扭曲到16.2,但它不适合我。

UPDATE 2017年1月3日

我不能复制一个本地流浪汉机器上的问题,尽管使用相同的代码和nginx的,主管gunicorn达芙妮相同的设置。我试图改变通道层的设置,所以它使用IPC而不是redis,并且它可以工作。这里的设置:

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

不过,我打算使用Redis的通道层,因为它更容易比IPC规模这并不能解决当前的问题。这是否意味着我的redis服务器有问题?

+0

您是否找到解决方案? –

+0

除了像我上面写的那样转换到IPC后端,我发现更新通道和所有后端到当前版本解决了这个问题。当我遇到问题时,我使用了0.x版本@EvgeniyaTveritinova – akiortagem

我觉得你的连接犯规完成的原因是因为你不发送这样的接受消息: message.reply_channel.send({'accept': True})

这是我的版本渠道的什么作品,但你应该检查文档为您的版本以确保对您有用

+0

我离开了使用Channels的项目。我没有升级到最新版本的渠道版本,并添加到代码行,它的工作原理。我认为问题是因为我使用的是旧版本的Channels(v 0.x) – akiortagem