django - 通道 websocket AsyncJsonWebsocketConsumer 未达到断开连接
问题描述
我有以下消费者:
class ChatConsumer(AsyncJsonWebsocketConsumer):
pusher = None
async def connect(self):
print(self.scope)
ip = self.scope['client'][0]
print(ip)
self.pusher = await self.get_pusher(ip)
print(self.pusher)
await self.accept()
async def disconnect(self, event):
print("closed connection")
print("Close code = ", event)
await self.close()
raise StopConsumer
async def receive_json(self, content):
#print(content)
if 'categoryfunctionname' in content:
await cellvoltage(self.pusher, content)
else:
print("ERROR: Wrong data packets send")
print(content)
@database_sync_to_async
def get_pusher(self, ip):
p = Pusher.objects.get(auto_id=1)
try:
p = Pusher.objects.get(ip=ip)
except ObjectDoesNotExist:
print("no pusher found")
finally:
return p
连接、接收甚至从数据库中异步获取数据都可以完美运行。只有断开连接不能按预期工作。以下终端日志解释了发生了什么:
2018-09-19 07:09:56,653 - INFO - server - HTTP/2 support not enabled (install the http2 and tls Twisted extras)
2018-09-19 07:09:56,653 - INFO - server - Configuring endpoint tcp:port=1111:interface=192.168.1.111
2018-09-19 07:09:56,653 - INFO - server - Listening on TCP address 192.168.1.111:1111
[2018/09/19 07:11:25] HTTP GET / 302 [0.02, 10.171.253.112:35236]
[2018/09/19 07:11:25] HTTP GET /login/?next=/ 200 [0.05, 10.111.253.112:35236]
{'type': 'websocket', 'path': '/ws/chat/RP1/', 'headers': [(b'upgrade', b'websocket'), (b'connection', b'Upgrade'), (b'host', b'10.111.111.112:1111'), (b'origin', b'http://10.111.253.112:1111'), (b'sec-websocket-key', b'vKFAnqaRMm84AGUCxbAm3g=='), (b'sec-websocket-version', b'13')], 'query_string': b'', 'client': ['10.111.253.112', 35238], 'server': ['192.168.1.111', 1111], 'subprotocols': [], 'cookies': {}, 'session': <django.utils.functional.LazyObject object at 0x7fe4a8d1ba20>, 'user': <django.utils.functional.LazyObject object at 0x7fe4a8d1b9e8>, 'path_remaining': '', 'url_route': {'args': (), 'kwargs': {'room_name': 'RP1'}}}
10.111.253.112
[2018/09/19 07:11:25] WebSocket HANDSHAKING /ws/chat/RP1/ [10.111.253.112:35238]
[2018/09/19 07:11:25] WebSocket CONNECT /ws/chat/RP1/ [10.111.111.112:35238]
no pusher found
1 - DEFAULT - 0.0.0.0
ERROR: Wrong data packets send
{'hello': 'Did I achieve my objective?'}
[2018/09/19 07:11:46] WebSocket DISCONNECT /ws/chat/RP1/ [10.111.253.112:35238]
2018-09-19 07:11:56,792 - WARNING - server - Application instance <Task pending coro=<SessionMiddlewareInstance.__call__() running at /home/pi/PycharmProjects/LOGGER/venv/lib/python3.6/site-packages/channels/sessions.py:175> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/lib/python3.6/asyncio/futures.py:403, <TaskWakeupMethWrapper object at 0x7fe4a82e6fd8>()]>> for connection <WebSocketProtocol client=['10.171.253.112', 35238] path=b'/ws/chat/RP1/'> took too long to shut down and was killed.
在 10 秒超时后,它会发出连接被终止的警告:
警告 - 服务器 - 在 linenumber 的位置运行的应用程序实例任务名连接 cxn-name 需要太长时间才能关闭并被杀死。
因此也没有达到断开方法。
- 这可能是什么?
- 我使用正确的方法吗?
- 我可以延长超时时间吗?
解决方案
如果您打算在连接关闭期间运行一些自定义逻辑,那么您应该覆盖websocket_disconnect
然后调用 super (而不是自己引发异常)
推荐阅读
- c# - User.Identity 中的 HttpContextAccessor 出现 null
- memory-management - kernel/kalloc.c:kmem全局变量初始化时
- angular - 编写自定义 ngrx 运算符并返回源 observable 类型
- macos - 在 pygame 中打印 Pyautogui 命令
- python - 从最大值对两个列表进行排序
- c - pset5 Speller - 我不知道代码有什么问题。谁能指导我找出我的错误?我已经包含了所有内容
- windows - 文件 winmon.sys 是 windows/system32/drivers 文件夹中的病毒吗?请帮我解决这个问题
- c++ - 获取进程在内核空间中花费的时间
- python - 计算 QTextEdit 中有多少填充行
- python - 如何在熊猫数据框图中有黑白/灰色阴影线