Flask 3.x async视图需ASGI服务器(如uvicorn)才能真正异步执行,WSGI下会退化为同步或报错;async视图须用协程友好IO库,钩子函数不支持异步,SQLAlchemy需配置异步驱动与AsyncSession。

Flask 3.x 原生支持 async 视图,但「支持」不等于「自动生效」——它只在 ASGI 服务器(如 uvicorn)下真正异步执行;用 flask run 或 gunicorn(默认 WSGI 模式)会静默退化为同步,甚至抛出 RuntimeError: Attempted to run async function synchronously。
async 视图函数必须用 async def 定义,且不能混用阻塞调用
这是最基础也最容易翻车的一环:写了 async def,但里面调了 requests.get() 或 time.sleep(),整个事件循环就卡死。
-
async视图内所有 IO 操作必须是协程友好的:用aiohttp.ClientSession、httpx.AsyncClient、asyncpg.connect()等,而非requests、sqlite3、psycopg2 - 若必须用同步库(比如某个 SDK 不提供异步接口),得走
loop.run_in_executor()包装,但会引入线程开销,且需手动控制线程池大小 -
request、g、session在async视图中可用,但它们的生命周期仅限当前请求协程,不会跨await边界泄漏
生产环境必须用 ASGI 服务器启动,WSGI 服务器不支持 await
flask run 默认走 Werkzeug 的 WSGI 实现,它没有事件循环,await 无处可落。开发时加 --debug --reload 可能“看起来能跑”,但那只是调试模式下的有限兼容,不可用于压测或上线。
- 推荐
uvicorn main:app或hypercorn main:app,它们原生处理ASGI协议 -
gunicorn必须显式启用--worker-class uvicorn.workers.UvicornWorker,否则仍是 WSGI 模式,async视图会被当作普通函数调用 - 别信
app.run()—— 它是同步接口,直接调用会报There is no current event loop
before_request / after_request 等钩子函数不支持异步
即使你写成 @app.before_request + async def setup():,Flask 也不会 await 它,而是把协程对象当普通函数返回,导致未消费协程、内存泄漏或警告。
火焰围攻 授权: q15040409-creator.功能概述火焰围攻 授权: q15040409-creator.是一项面向实际任务的技能,主要用于Description.;Flask Web. - Python.;核心要点HTTP?;.Version.1.0.tags. wrap.github.automation.。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。使用与执行使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要
立即学习“Python免费学习笔记(深入)”;
- 预处理逻辑必须收进视图内部:
async def view(): await pre_check(); return ... - 若需全局复用,封装为普通函数,或改用 ASGI 中间件(如
uvicorn的middleware参数)替代 Flask 钩子 -
g对象不能在before_request里设异步值:g.data = await fetch()是无效的,因为钩子本身不同步执行
数据库操作要用真正的异步驱动和 AsyncSession
SQLAlchemy 默认是同步 ORM。session.query().all() 这类调用哪怕在 async 视图里也会阻塞事件循环。
- 必须配
create_async_engine("postgresql+asyncpg://...")+AsyncSession - 查询要写成
await session.execute(...)、await result.scalars().all(),不是result.scalars().all() - 别指望
db.session(Flask-SQLAlchemy 旧版)能自动适配异步——它没这个能力,得换用sqlalchemy.ext.asyncio生态
真正的异步瓶颈不在写法,而在生态链路是否全异步:从服务器 → 视图 → HTTP 客户端 → 数据库驱动,任一环节掉链子,整个请求就退回同步模型。最容易被忽略的是钩子函数的伪异步写法,以及把 async def 当作性能银弹——它只释放 IO 等待时间,不解决 CPU 密集型任务。

















