Django каналы веб-сокета переподключаются - PullRequest
0 голосов
/ 05 апреля 2020

Я создаю систему обмена сообщениями в Django, используя веб-сокет для получения сообщения.

Вот мои попытки,

from channels.consumer import AsyncConsumer
from channels.db import database_sync_to_async

class ChatConsumer(AsyncConsumer):

    async def websocket_connect(self, event):
        print("connected", event)
        await self.send({
            "type": "websocket.accept"
        })

    async def websocket_receive(self, event):
        print("receive", event)
        message = event['text']
        obj = await self.create_obj(message=message)
        print('Created...')

    async def websocket_disconnect(self, event):
        print("disconnected", event)

    @database_sync_to_async
    def create_obj(self, **kwargs):
        obj = ChatMessage.objects.create(message=kwargs['message'])
        return obj

Когда я запускаю клиентское приложение, Веб-сокет подключен, и я могу получить сообщение, и я могу сохранить в БД.

connected {'type': 'websocket.connect'}
WebSocket CONNECT /ws/message [192.168.0.101:50148]

После некоторого простоя веб-сокет автоматически отключается,

Application instance <Task pending coro=<SessionMiddlewareInstance.__call__() running at /Users/ajay/Desktop/workspace/projects/python/django/websock/venv/lib/python3.7/site-packages/channels/sessions.py:183> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x10b311510>()]>> for connection <WebSocketProtocol client=['192.168.0.101', 50148] path=b'/ws/message'> took too long to shut down and was killed.

После разъединения я не могу получить сообщение, когда я перезагружаю клиент, подключен веб-сокет, есть ли способ автоматически переподключить we-сокет без перезагрузки клиента. Я прошу направить мне некоторые предложения для достижения этой цели, это будет очень полезно для меня, заранее спасибо.

1 Ответ

0 голосов
/ 05 апреля 2020

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

 # part of Client Code in the main while loop
 while not self.finished:
        try:
            self.websocket = await websockets.client.connect(
                self.connect_url,
                max_size=None,
                extra_headers=self.extra_headers
            )
.....
# in your`s producer
.......
 while True:
        # Make sure connection is still live.
        pong_waiter = await self.websocket.ping()
        await pong_waiter # if you will not await in 10-20 sec connection will close.
...