0

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

重新启动daphne解决了一段时间的问题。

细节

日志中的任何地方都没有出现错误,只是消息不再由消费者处理。

我正在使用以下库:

  • aioredis==1.2.0
  • asgiref==2.3.2
  • 通道-redis==2.3.2
  • 频道==2.1.6
  • 达芙妮==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()到消费者的运输被破坏了。

4

2 回答 2

2

我在 Python3.8 中遇到了这个问题。所以我通过切换到 Python3.6 来修复它

Django 频道 - 客户端有时会收到消息,而不是其他时候,直到它根本没有收到它

于 2020-08-04T07:35:23.030 回答
0

有一个已知错误会导致在 Python 3.5 中运行的 Channels 应用程序在一段时间后断开连接。更新到 Python 3.6 以获得可能的修复

于 2019-01-31T16:57:39.007 回答