Django Channels disconnect вызывается перед представлением после обновления

Я встретил ошибку, которая полностью взорвала мой разум. Я не знаю, как это возможно, я хотел бы поделиться, и, пожалуйста, если вы можете предложить знания и, возможно, решение со мной.

вот основная структура моего кода:

  1. пользователь отправляет запрос
  2. когда вызывается функция view, создайте экземпляр.
  3. когда веб-сокет отключается, удалите экземпляр.

проблема в следующем: когда я обновляю страницу на локальной машине, иногда последний веб-сокет закрывается после вызова функции view

Не знаю почему так происходит, назовем страницу A и после обновления, новая страница B, разве не так должно быть:

  1. вызывается A, создайте экземпляр 1
  2. обновить
  3. веб-сокет A закрыт, удалить экземпляр
  4. вызывается B, создать экземпляр 2

Иногда это работает, как ожидалось, но в других случаях последовательность превращается в:

  1. вызывается A, создайте экземпляр 1
  2. обновить
  3. В вызывается, создать экземпляр 2
  4. веб-сокет A закрыт, удалить экземпляр

и это ломает мой код из-за фильтра, применяемого при удалении, в результате чего нужный мне экземпляр после обновления исчезает!

Я не знаю, должен ли я что-то делать, потому что я считаю, что есть большой шанс, что это происходит только на локальной машине.


некоторый извлеченный код

view

@login_required
def chatFriendsView(request):
    # ...
    toread = Toread(
        sender=sender,
        receiver=request.user, 
    )
    toread.save()
    return render(request, 'chat/chat_friends.html')

model

class Toread(models.Model):
    sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='sendToread')
    receiver = models.ForeignKey(User, on_delete=models.CASCADE, related_name='receiveToread')
    # ...

    def __str__(self):
        return str(self.receiver)

ws

class ChatConsumer(AsyncJsonWebsocketConsumer):
    @staticmethod
    @database_sync_to_async
    def dismissToread(sender_pk, receiver_pk):
        for tr in Toread.objects.filter(
            sender=User.objects.get(pk=sender_pk), 
            receiver=User.objects.get(pk=receiver_pk), 
        ):
            tr.delete()

    async def disconnect(self, close_code):
        await ChatConsumer.dismissToread(
            sender_pk=int(self.scope['user'].pk),
            receiver_pk=int(self.room_name), 
        )
        await self.channel_layer.group_discard(
            self.room_group_name, 
            self.channel_name, 
        )

    # ...
    

Вернуться на верх