【发布时间】:2017-05-14 15:23:50
【问题描述】:
我在使用 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 事件时,worker 没有响应它。
还有另一个question 与此问题接近,已通过将 Twisted 降级到 16.2 来解决,但它对我不起作用。
2017 年 1 月 3 日更新
尽管对 nginx、supervisor、gunicorn 和 daphne 使用相同的代码和相同的设置,但我无法在本地 vagrant 机器上复制该问题。我尝试更改通道层设置,使其使用 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
标签: django websocket django-channels daphne