如何修复django渠道使用者停止处理发送到组的消息的问题

时间:2019-01-30 18:49:02

标签: django websocket django-channels daphne

使用group_send()向组发送消息后,一段时间后突然停止工作。使用者的处理程序方法不再被调用。

重新启动daphne可以解决此问题一段时间。

详细信息

日志中的任何地方都没有错误显示,只是消息不再由使用者处理。

我正在使用以下库:

  • aioredis == 1.2.0
  • asgiref == 2.3.2
  • channels-redis == 2.3.2
  • channels == 2.1.6
  • daphne == 2.2.4
  • django == 2.1.5
  • redis == 3.0.1

代码

# settings.py
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {"hosts": [("localhost", "6379")]},
    }
}
# views.py
class ReceiveEventView(APIView):
    def post(self, request, *args, **kwargs):
        # payload: {"type": "event_triggered", "group": "warning", "message": "Button pressed"}
        # or
        # payload: {"type": "event_triggered", "group": "danger", "message": "Red Button pressed"}
        payload = json.loads(request.POST.get("payload", "{}"))
        if (payload.get("type") == "event_triggered"):
            async_to_sync(channel_layer.group_send)(payload.get("group"), payload)
        return HttpResponse(status=204)
# consumers.py
class EventConsumer(WebsocketConsumer):
    def connect(self):
        if not self.scope["user"].is_authenticated:
            return
        self.accept()
        for group in get_subscriptions(self.scope["user"]):
            async_to_sync(self.channel_layer.group_add)(group, self.channel_name)

    def disconnect(self, close_code):
        if not self.scope["user"].is_authenticated:
            return
        for group in get_subscriptions(self.scope["user"]):
            async_to_sync(self.channel_layer.group_discard)(group, self.channel_name)

    def event_triggered(self, event):
        logger.debug("Consumer::event_triggered()")
        self.send(text_data=json.dumps(event))

预期和实际结果

一段时间Consumer::event_triggered()出现在日志中,但突然停止。通过WebSocket从浏览器接收消息仍然有效。从group_send()到消费者的运输中断了。

2 个答案:

答案 0 :(得分:1)

我在使用Python3.8时遇到了这个问题。所以我通过切换到Python3.6来解决了这个问题

Django channels - Client receives message sometimes and not other times till it doesn't recieve it at all

答案 1 :(得分:0)

一段时间后,有known bug导致在Python 3.5中运行的Channels应用程序的连接中断。更新至Python 3.6以获得可能的修复程序