是否可以将 Flask RestX 与 Flask 的 2.0+ 异步等待一起使用?

pyt*_*ife 10 python flask flask-restful python-asyncio

Flask 2.0 中介绍了 async/await 的用法。(https://flask.palletsprojects.com/en/2.0.x/async-await/

我正在使用 Flask-RestX,那么是否可以在 RestX 请求处理程序中使用async/ ?await

就像是:

@api.route('/try-async')
class MyResource(Resource):
    @api.expect(some_schema)
    async def get(self):
        result = await async_function()
        return result
Run Code Online (Sandbox Code Playgroud)

不起作用,当我尝试到达此端点时,出现错误:

TypeError: Object of type coroutine is not JSON serializable

有这方面的信息吗?

封装版本:

flask==2.0.1
flask-restx==0.4.0
Run Code Online (Sandbox Code Playgroud)

我也flask[async]按照文档的建议安装了。

小智 2

我已经通过使用内部重定向解决了这个问题

@api.route('/try-async')
class MyResource(Resource):
    @api.expect(some_schema)
    def get(self):
        return redirect(url_for('.hidden_async'), code=307)

@api.route('/hidden-async', methods=['GET'])
async def hidden_async():
    result = await async_function()
    return result
Run Code Online (Sandbox Code Playgroud)

重定向code=307将确保重定向(链接)后任何方法和主体都不会发生变化。因此,将数据传递给异步函数也是可能的。

@api.route('/try-async')
class MyResource(Resource):
    @api.expect(some_schema)
    def post(self):
        return redirect(url_for('.hidden_async'), code=307)

@api.route('/hidden-async', methods=['POST'])
async def hidden_async():
    data = request.get_json()
    tasks = [async_function(d) for d in data]
    result = await asyncio.gather(tasks)
    return result
Run Code Online (Sandbox Code Playgroud)