Flask 2.0+搭配Flask-RestX能否使用async/await语法?
问题原因
flask-restx==0.4.0版本未适配Flask 2.0+的原生async支持,框架的Resource请求调度逻辑无法识别async类型的请求处理方法,不会自动执行方法返回的协程对象,直接将协程实例交给JSON序列化模块处理,因此触发TypeError: Object of type coroutine is not JSON serializable报错。
解决方案
- 方案1:升级flask-restx到适配async的版本
1.1.0及以上版本的flask-restx已经完成了Flask async特性的适配,原有async视图代码不需要做任何修改即可正常运行,升级命令如下:pip install --upgrade flask-restx>=1.1.0 - 方案2:固定使用0.4.0版本时手动包装异步逻辑
如果因项目依赖限制无法升级flask-restx,可以借助Flask内置的ensure_sync方法手动执行异步逻辑,将协程的返回值作为接口返回,参考实现如下:from flask import current_app @api.route('/try-async') class MyResource(Resource): @api.expect(some_schema) def get(self): # 所有异步逻辑封装到内部async函数中 async def _handle_request(): result = await async_function() # 可在此处添加其他异步操作 return result # 用Flask提供的同步包装器执行异步逻辑 return current_app.ensure_sync(_handle_request)()
注意事项
- 生产环境运行async视图时,建议使用Uvicorn、Hypercorn等ASGI服务器,使用传统WSGI服务器运行async视图会产生额外的性能开销。
- 若使用方案2,不要在async逻辑中直接调用Flask的线程局部变量(如request、g),如果需要使用这些变量,建议提前在同步层取值后传入async函数。
内容的提问来源于stack exchange,提问作者pythonislovepythonislife
相关产品推荐
相关产品推荐

