【问题标题】:Is it possible to use Flask RestX wih Flask's 2.0+ async await?是否可以将 Flask RestX 与 Flask 2.0+ 异步等待一起使用?
【发布时间】: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]

【问题讨论】:

    标签: python flask python-asyncio flask-restful


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2017-03-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      相关资源
      最近更新 更多