首页 > 解决方案 > Django 通道阻止数据库访问

问题描述

我正在将当前项目从频道 v1 升级到 v3,我有点卡在这里

class MultiplexConsumer(WebsocketConsumer):

    def connect(self):
        print(11111111, self.scope)
        logger.debug("Received new connection request from {}", self.channel_name)
        WebSocketsConnection.objects.create(channel_id=self.channel_name, last_pong=datetime.datetime.now())
        print(444444444)
        self.accept()
        print(555555555)

   ...

class WebSocketsConnection(models.Model):
    """
        This model exists because Django channels does not provide a default way to handle user presence.
    """
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    channel_id = models.CharField(max_length=50)
    user = models.ForeignKey(User, null=True, blank=True, on_delete=models.deletion.SET_NULL)
    last_pong = models.DateTimeField(auto_now_add=True)
    type = models.CharField(max_length=30, null=True, blank=True)
    data = JSONField(default={})

    def ping(self):
        channel_layer = get_channel_layer()
        async_to_sync(channel_layer.send)(self.channel_id, create_action('API', APIConstants.PING), immediately=True)

    def pong(self):
        self.last_pong = timezone.now()
        self.save()

    def get_groups(self):
        groups = []
        for sub in WebSocketsConnectionSubscription.objects.filter(ws_connection=self):
            groups.append(sub.get_group_id())
        return groups

    def _add_subscription(self, data, sub_type):
        try:
            sub = WebSocketsConnectionSubscription.objects.get(ws_connection=self, type=sub_type)
            sub.data = data
            sub.save()
        except WebSocketsConnectionSubscription.DoesNotExist:
            WebSocketsConnectionSubscription.objects.create(ws_connection=self, data=data, type=sub_type)

它从不打印444444444,如果我删除WebSocketsConnection模型创建语句,它会正常运行。有任何想法吗?

我检查了没有附加模型信号WebSocketsConnection

标签: django-channels

解决方案


我设法找出了问题,该self.channel_name字段的值太长channel_id = models.CharField(max_length=50)

一旦我将其更改为 100 个字符,它就可以正常工作,但为什么它没有抛出任何错误仍然未知。

更新:消费者不向上传播错误是一个已知问题如何查看渠道消费者引发的异常


推荐阅读