首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python/Quart:如何在等待响应时发送?

Python/Quart:如何在等待响应时发送?
EN

Stack Overflow用户
提问于 2022-02-16 21:07:22
回答 1查看 271关注 0票数 0

使用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()上花费一段很短的时间:

代码语言:javascript
复制
@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。

我怀疑有一个更好的方法来实现这一点,使用期货和异步,但我不清楚从文档。

EN

回答 1

Stack Overflow用户

发布于 2022-02-18 09:58:51

我认为您的代码正在等待客户端的消息。在这种情况下你可能不需要它。

我试着写代码,就像你描述你的需求一样,

代码语言:javascript
复制
@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

它能做你想做的事吗?如果不做错的话?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71149277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档