我遇到了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服務器有問題?
您是否找到解決方案? –
除了像我上面寫的那樣轉換到IPC後端,我發現更新通道和所有後端到當前版本解決了這個問題。當我遇到問題時,我使用了0.x版本@EvgeniyaTveritinova – akiortagem