2016-12-30 66 views
3

我遇到了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

回答

0

我覺得你的連接犯規完成的原因是因爲你不發送這樣的接受消息: message.reply_channel.send({'accept': True})

這是我的版本渠道的什麼作品,但你應該檢查文檔爲您的版本以確保對您有用

+0

我離開了使用Channels的項目。我沒有升級到最新版本的渠道版本,並添加到代碼行,它的工作原理。我認爲問題是因爲我使用的是舊版本的Channels(v 0.x) – akiortagem