运行时警告:从未等待协同路由“some_xyz_方法”

2024-09-30 14:21:33 发布

您现在位置:Python中文网/ 问答频道 /正文

在方法1中,我希望先执行try块,然后执行call_ordercreate方法,使用asyncio尝试,但得到错误输出,如描述所示,如何解决此问题

方法#1


@app.route("/slack/message_actions", methods=[ "POST" ])
def message_actions():

        if (payload[ "type" ] == "view_submission" and payload[ "view" ][ "callback_id" ] == "sthpush"):
            print("entered push")
            call_ordercreate(thread_ts, user_name)  **# Run this method after executing try block** 
            try:
                return jsonify(
                    {
                        "response_action": "push",
                        "view": orderwaitmessage,
                    }
                )
            except SlackApiError as e:
                code = e.response[ "error" ]
                return make_response(f"Failed to open a modal due to {code}", 200)

方法#2

async def call_ordercreate(thread_ts, user_name):
    await asyncio.sleep(4)
    url_list1 = CONST_ORDERCREATE_API  
    r = requests.get(url)

错误输出

C:/Users/PycharmProjects/iptautobot-events/newapp.py:263: RuntimeWarning: coroutine 'call_ordercreate' was never awaited
call_ordercreate(thread_ts, user_name)
RuntimeWarning: Enable tracemalloc to get the object allocation traceback

Tags: to方法nameviewactionsasynciomessageresponse
1条回答
网友
1楼 · 发布于 2024-09-30 14:21:33

这里的问题是,您试图从一个正常的同步函数调用一个异步函数。您应该使用^{}方法来运行该函数。这不会引起RuntimeWarning。因此,您的代码将如下所示:

@app.route("/slack/message_actions", methods=[ "POST" ])
def message_actions():

        if (payload[ "type" ] == "view_submission" and payload[ "view" ][ "callback_id" ] == "sthpush"):
            print("entered push")
            asyncio.run(call_ordercreate(thread_ts, user_name))
            try:
                return jsonify(
                    {
                        "response_action": "push",
                        "view": orderwaitmessage,
                    }
                )
            except SlackApiError as e:
                code = e.response[ "error" ]
                return make_response(f"Failed to open a modal due to {code}", 200)

然而,您似乎希望在将响应返回给用户之后运行call_ordercreate。恐怕这是不可能的,因为一旦您return,整个请求上下文就会被破坏。此外,flask(我假设它是flask)是一个WSGI服务器,这意味着它以同步方式处理请求。这就是为什么使用asyncio.run是调用异步函数的唯一方法。缺点是什么?它等待任务完成,而这绝对不是您想要实现的

相关问题 更多 >