使用Python3.9和夸脱0.15.1,我试图创建一个websocket路由,该路由将侦听websocket上传入的请求数据,解析它,并在循环中一次又一次地向客户端发送出站响应数据--直到并且除非客户机在有效负载中发送带有给定键"key"的JSON结构,这时我们可以继续进一步处理。
我可以接收来自客户机的初始入站请求,解析它,并在一个循环中发送出站响应,但是当我试图收集第二个有效负载来解析"key"的存在时,事情就会分崩离析。我似乎可以await websocket.send_json()或await websocket.receive(),但不能同时使用。
夸脱文档建议使用异步超时(https://pgjones.gitlab.io/quart/how_to_guides/request_body.html?highlight=timeout)来超时,如果请求的主体没有在所需的时间内收到,所以我想我应该尝试在while循环中发送消息,如果响应不是receive()d,在超时之前在await websocket.receive()上花费一段很短的时间:
@app.websocket('/listen')
async def listen():
payload_requested = await websocket.receive()
parsed_payload_from_request = json.loads(payload_requested)
while "key" not in parsed_payload_from_request:
response = "response string"
await websocket.send_json(response)
async with timeout (1):
payload_requested = await websocket.receive()
parsed_payload_from_request = json.loads(payload_requested)
if "key" == "present":
do_stuff()...but似乎不起作用,超时会抛出一个asyncio.exceptions.CancelledError。
我怀疑有一个更好的方法来实现这一点,使用期货和异步,但我不清楚从文档。
发布于 2022-02-18 09:58:51
我认为您的代码正在等待客户端的消息。在这种情况下你可能不需要它。
我试着写代码,就像你描述你的需求一样,
@app.websocket('/listen')
async def listen():
while True:
data = await websocket.receive_json()
if "key" in data:
await websocket.send_json({"key": "response"})
else:
do_stuff()
return # websocket closes它能做你想做的事吗?如果不做错的话?
https://stackoverflow.com/questions/71149277
复制相似问题