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

Posted

技术标签:

【中文标题】是否可以将 Flask RestX 与 Flask 2.0+ 异步等待一起使用?【英文标题】:Is it possible to use Flask RestX wih Flask's 2.0+ async await? 【发布时间】:2021-09-07 22:22:41 【问题描述】:

在 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

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

TypeError: Object of type coroutine is not JSON serializable

有这方面的资料吗?

软件包版本:

flask==2.0.1
flask-restx==0.4.0

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

【问题讨论】:

【参考方案1】:

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

@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

使用code=307 重定向将确保重定向后任何方法和主体都不会改变(Link)。因此也可以将数据传递给异步函数。

@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

【讨论】:

以上是关于是否可以将 Flask RestX 与 Flask 2.0+ 异步等待一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

Flask 学习-42.Flask-RESTX 快速入门

Flask 学习-44.Flask-RESTX 请求参数校验reqparse.RequestParser()

Flask 学习-79.Flask-RESTX 参数校验reqparse 解析器继承与更新

Flask 学习-47.Flask-RESTX 自定义响应内容marshal_with

Flask 学习-75.Flask-RESTX 使用 marshal_with 处理嵌套字段

Flask 学习-76.Flask-RESTX 处理异常@api.errorhandler