Django Channels disconnect вызывается перед представлением после обновления
Я встретил ошибку, которая полностью взорвала мой разум. Я не знаю, как это возможно, я хотел бы поделиться, и, пожалуйста, если вы можете предложить знания и, возможно, решение со мной.
вот основная структура моего кода:
- пользователь отправляет запрос
- когда вызывается функция view, создайте экземпляр.
- когда веб-сокет отключается, удалите экземпляр.
проблема в следующем: когда я обновляю страницу на локальной машине, иногда последний веб-сокет закрывается после вызова функции view
Не знаю почему так происходит, назовем страницу A
и после обновления, новая страница B
, разве не так должно быть:
- вызывается A, создайте экземпляр 1
- обновить
- веб-сокет A закрыт, удалить экземпляр
- вызывается B, создать экземпляр 2
Иногда это работает, как ожидалось, но в других случаях последовательность превращается в:
- вызывается A, создайте экземпляр 1
- обновить
- В вызывается, создать экземпляр 2
- веб-сокет 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,
)
# ...