是否可以将 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 学习-44.Flask-RESTX 请求参数校验reqparse.RequestParser()
Flask 学习-79.Flask-RESTX 参数校验reqparse 解析器继承与更新
Flask 学习-47.Flask-RESTX 自定义响应内容marshal_with