flask 3.0原生支持async视图,但必须运行于asgi服务器(如uvicorn/hypercorn),禁用flask run和gunicorn;异步视图中须用aiohttp或httpx.asyncclient,禁用requests等阻塞操作。

Flask 3.0 原生支持异步视图,但直接把 async def 写进路由函数里,不加配套处理,大概率会卡死或返回空响应——关键不在“能不能写 async”,而在“事件循环怎么跑、阻塞怎么避、扩展怎么配”。
Flask 3.0 异步视图必须运行在支持 asyncio 的 WSGI 替代品上
Flask 自身仍是同步框架,async 视图依赖底层服务器能调度协程。默认的开发服务器 flask run(基于 Werkzeug 3.0+)已内置 asyncio 支持,但仅限开发;生产环境必须换用 uvicorn 或 hypercorn 等 ASGI 服务器。
-
uvicorn是最轻量的选择:uvicorn app:app --workers 2(注意不能用--reload配合多进程,会冲突) - 别用
gunicorn+gevent混搭——它跑的是 greenlet,不是 asyncio 事件循环,await会直接报RuntimeError: no running event loop - 如果用了
flask-sqlalchemy旧版(session.query() 是同步阻塞的,必须换成SQLAlchemy 2.0++async_engine+AsyncSession
异步视图里不能混用同步阻塞调用
写了 async def 不等于自动非阻塞。time.sleep(2)、requests.get()、open() 这类全是同步阻塞操作,会在协程里锁死整个事件循环。
- 替代
time.sleep:用await asyncio.sleep(2) - 替代
requests:用httpx.AsyncClient()或aiohttp.ClientSession() - 替代同步文件读写:用
await aiofiles.open(...).read() - 调用第三方库前先查文档——比如
redis-py4.0+ 提供Redis.from_url(..., decode_responses=True)+await redis.get("key"),但低版本不行
别在异步视图里直接调用 Flask 同步扩展的方法
像 flask-login 的 current_user、flask-wtf 的 form.validate_on_submit() 默认都是同步的,它们内部可能触发 session 加载、CSRF token 生成等阻塞操作。
-
current_user在异步上下文里是代理对象,访问属性(如current_user.id)会触发同步加载——需提前在视图开头用await current_user.get_id()(如果扩展支持)或改用flask-login0.6.3+ 的await login_manager.reload_user() -
flask-wtf无原生异步支持,表单验证必须拆成两步:await request.form获取数据,再用form.process(formdata=...)+form.validate()(后者是纯内存操作,不 IO) - 日志记录别用
logging.info()直接打——磁盘 I/O 可能阻塞,改用await asyncio.to_thread(logging.info, "msg")或异步日志库如aiologger
异步视图返回值和错误处理有隐式约束
Flask 3.0 对 return 值做了适配,但仍有边界情况容易出错:
- 返回
dict或str没问题,但返回Response实例时,若里面含同步流式内容(如Response(stream_with_context(...))),仍会阻塞 -
abort(404)可以直接用,但自定义异常(如raise MyCustomError)的处理器必须也是async def,否则抛出RuntimeWarning: coroutine 'xxx' was never awaited - 全局异常捕获中间件(
@app.errorhandler)要显式标记async,且不能用try/except包裹整个异步视图——异常发生在 await 点,必须在协程内部处理
真正麻烦的从来不是写 async def,而是确认每个依赖组件是否真正在 asyncio 上跑、有没有偷偷执行同步 IO。一个没 await 的数据库查询,就能让整个 worker 进程卡住几秒——这比同步服务更难排查。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











