ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

如何把 Flask WSGI 应用通过 asgiref WsgiToAsgi 接入 Hypercorn ASGI 服务器?

如何把 Flask WSGI 应用通过 asgiref WsgiToAsgi 接入 Hypercorn ASGI 服务器? 如何把 Flask WSGI 应用通过 asgiref WsgiToAsgi 接入 Hypercorn ASGI 服务器【免费下载链接】flaskThe Python micro framework for building web applications.项目地址: https://gitcode.com/gh_mirrors/fl/flaskFlask 应用本身是一个 WSGI 应用只能被 WSGI 服务器加载。如果你的部署环境要求使用 ASGI 服务器例如需要跑在 Hypercorn 这类 ASGI 服务器上就需要一层 WSGI 到 ASGI 的中间件把现有的 Flask app 包装成 ASGI 应用后再交给服务器。Flask 官方文档 docs/deploying/asgi.rst 推荐的做法是用 asgiref 库的WsgiToAsgi适配器本文按这条路径完成接入安装依赖、包装应用、用 Hypercorn 启动并说明验证方式和限制。为什么需要 WsgiToAsgi 适配器docs/deploying/asgi.rst 明确指出想用 ASGI 服务器就必须引入 WSGI 到 ASGI 的中间件。文档推荐 asgiref 的WsgiToAsgi原因是它与 Flask 的 async/await 支持 所用的事件循环相集成。另外 docs/async-await.rst 的 Background tasks 一节给出了一个实际收益在纯 WSGI 环境下async 函数执行完事件循环就会停止未完成的任务会被取消因此不能在视图里用asyncio.create_task派生后台任务而通过WsgiToAsgi适配器配合 ASGI 服务器运行时适配器会创建一个持续运行的事件循环这类后台任务就可以派生了。安装依赖如果应用中会用到async def视图Flask 2.0 起支持需要以asyncextra 安装 Flask这会自动带上 asgiref$ pip install flask[async]pyproject.toml 中该 extra 的定义是async [asgiref3.2]即WsgiToAsgi所依赖的 asgiref 最低版本为 3.2。即使没有 async 视图WsgiToAsgi本身也要求 asgiref 已安装。同时安装 ASGI 服务器 Hypercorn$ pip install hypercornFlask 文档只给出 Hypercorn 的启动命令其安装按常规 pip 方式进行即可。用 WsgiToAsgi 包装 Flask 应用按照 docs/deploying/asgi.rst 给出的方式在定义app的模块末尾增加一个asgi_app变量把 Flask 实例包起来from asgiref.wsgi import WsgiToAsgi from flask import Flask app Flask(__name__) # 你现有的路由、蓝图、错误处理等逻辑保持不变 asgi_app WsgiToAsgi(app)asgi_app就是 ASGI 服务器要加载的对象。原有 WSGI 入口app变量保留即可两边并不冲突想回退到 WSGI 服务器时仍然可以直接用app。用 Hypercorn 启动Flask 文档给出的启动命令是$ hypercorn module:asgi_appmodule:asgi_app是{模块导入名}:{变量名}的写法——module换成你的asgi_app所在模块的点号导入路径asgi_app是变量名。这个约定与 Flask 部署文档中 Gunicorndocs/deploying/gunicorn.rst、Waitressdocs/deploying/waitress.rst对 WSGI 入口{module}:{app}的说明一致。例如asgi_app定义在hello.py中命令就是hypercorn hello:asgi_app。如果应用使用 app factory 模式module:后面同样可以写成工厂调用形式这一点在 docs/deploying/gunicorn.rst 中对 WSGI 服务器有对应说明如hello:create_app()。验证接入结果Flask 文档没有给出 Hypercorn 的固定启动输出示例验证按下面两条判断运行hypercorn module:asgi_app进程正常启动并开始监听请求说明 ASGI 入口被 Hypercorn 成功加载。向应用中已有的 Flask 路由发起请求返回内容应与应用原有行为一致——文档对这一步的表述就是 serving theasgi_appwith the ASGI server即asgi_app对外提供与原来app相同的 HTTP 服务。如果应用含 async 视图而报错注意 src/flask/app.py 中async_to_sync的实现找不到 asgiref 时 Flask 会抛出RuntimeError: Install Flask with the async extra in order to use async views.看到这个错误就回到安装依赖一节用pip install flask[async]补装 asgiref。边界与限制以下限制直接来自 docs/async-await.rst接入 ASGI 服务器后同样成立性能特征Flask 作为 WSGI 应用一个 worker 处理一个请求/响应周期即使是 async 视图每个请求仍会占用一个 worker可并发的请求数量不会因为 async 增加。async 的价值在于视图内部可以写并发 IO 代码多个数据库查询、外部 API 调用等而不是提升整体吞吐。Async is not inherently faster than sync code 是文档的原话。事件循环Flask 目前只支持asyncio。旧扩展兼容性Flask async 支持之前发布的扩展不预期 async 视图它们提供的视图装饰器大概率不会 await 被装饰的函数其余函数也不 awaitable在 async 视图里调用时大概率是阻塞的。扩展作者需要借助flask.Flask.ensure_sync才可能支持 async。如果代码库以 async 为主、需要大量长连接或 WebSocket文档建议单独评估基于 ASGI 的 Quart或 :doc:gevent方案那属于另一条选型路径不在本次接入范围内。相关文档ASGI 部署说明async/await 使用与性能说明部署总览【免费下载链接】flaskThe Python micro framework for building web applications.项目地址: https://gitcode.com/gh_mirrors/fl/flask创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表