当前位置: 首页 > news >正文

python quart

# Quart:一个被低估的异步Web框架

他是什么

Quart是一个Python的异步Web框架,由Flask的作者开发。他继承Flask的简洁API,但跑在异步IO上。

简单说,如果Flask是传统饭店,客人点完单后,服务员要等菜做好才能接下一桌。Quart就像现代餐厅,服务员接单后不用傻等,能去招呼其他客人,菜好了系统会提醒他。这就是异步和非异步的核心差异。

Quart使用Python原生的asyncio库,配合ASGI协议(异步服务器网关接口)。这让他和Flask在代码写法上很相似,但底层工作机制完全不同。

他能做什么

Quart擅长处理三类场景:

高并发IO密集型任务。比如WebSocket聊天应用、实时推送服务、数据采集网关。这些场景下,大量连接处于等待状态,异步框架能轻松应对数千个并发连接,而不会像同步框架那样因线程数过多导致内存暴涨。

微服务和API网关。因为异步特性,Quart能同时处理多个上游服务的请求,把这些请求的等待时间重叠起来。比如做一个聚合接口,需要分别调用用户服务、订单服务、商品服务,同步框架需要串行执行,Quart可以让它们并行发送请求。

流式响应。Quart原生支持异步生成器来流式传输数据。做文件上传下载、实时日志推送、AI模型的流式输出,Quart用起来特别顺畅。他可以用async迭代器逐块处理请求体,避免大文件占用过多内存。

怎么使用

安装很简单:pip install quart

基础用法和Flask几乎一样:

fromquartimportQuart,request app=Quart(__name__)@app.route('/')asyncdefindex():return{'message':'Hello, World!'}

注意view函数加了async关键字。这是Quart和Flask最大的语法差异。

WebSocket的写法更简洁:

@app.websocket('/ws')asyncdefws_handler():whileTrue:data=awaitwebsocket.receive()awaitwebsocket.send(f'收到:{data}')

处理并发请求可以用gather

importasyncioimporthttpx@app.route('/multi')asyncdefmulti_api():asyncwithhttpx.AsyncClient()asclient:urls=[f'http://api.example.com/{i}'foriinrange(5)]responses=awaitasyncio.gather(*[client.get(url)forurlinurls])return[r.json()forrinresponses]

这里asyncio.gather会并行发起5个请求,总耗时约等于最慢的那个请求。

最佳实践

别把Quart当作Flask用。有些开发者习惯在Flask里用time.sleep,换成Quart后改成await asyncio.sleep,这没错。但更关键的是要理解,在Quart里任何阻塞操作(比如数据库查询、文件读写、外部HTTP请求)都应该异步化。如果用了同步数据库驱动(如psycopg2),Quart的异步优势就荡然无存。

选择合适的异步数据库驱动。比如数据库用asyncpgdatabases,ORM用sqlalchemy[asyncio],缓存用aioredis。这些库的API风格和同步版本很像,但底层是非阻塞的。

小心线程不安全的操作。在异步任务里操作全局变量要加锁,或者使用asyncio.Lock。比如做计数器统计,用asyncio.Lock保护自增操作。

使用生产级服务器。开发时可以直接用app.run(),但生产环境要用HypercornUvicorn。比如:hypercorn app:app --bind 0.0.0.0:8000

合理使用中间件。Quart支持类似Flask的before_requestafter_request钩子,但也是异步的。可以方便地实现请求日志、限流、CORS等功能。

和同类技术对比

vs Flask:Flask的生态更成熟,插件多,社区大。如果项目是简单的CRUD应用,用户量不大,用Flask更省心。Quart的优势在高并发和实时通信。有一个折中方案:先写Flask,等性能瓶颈出现时再迁移,因为Quart兼容Flask的大部分API。

vs FastAPI:FastAPI也是异步框架,但多了数据验证(基于Pydantic)和自动API文档。如果项目需要严格的数据模型和Swagger文档,FastAPI更合适。Quart的优点是更贴近Flask的编程习惯,迁移成本低。FastAPI的学习曲线稍陡,但功能更完善。

vs Sanic:Sanic也是异步框架,性能表现好,但社区较小。Quart因为背靠Flask生态,在插件和文档方面占优。Sanic的API设计更激进,有些地方和标准Flask风格不同。

vs Django Channels:Django的WebSocket方案需要额外配置,不像Quart这样原生支持。但Django的ORM和后台管理功能是Quart不具备的。如果是Django项目,用Channels是自然选择;新项目选Quart会更轻量。

总的来说,Quart是一个好选择,但不是什么场景都需要。比如做一个内部管理系统,用户数不超过两位数,用Flask完全够用。只有在明确需要异步能力时——比如WebSocket、长连接、高并发IO——Quart才真正发光。

http://www.jsqmd.com/news/740242/

相关文章:

  • 深入AD9361 No-OS驱动:在ZC706上通过SPI配置FMComms5的底层代码解析
  • Windows内存清理终极教程:Mem Reduct让你的电脑重获新生
  • C语言医疗软件如何通过FDA 510(k)认证:7步静态分析+动态追溯流程,附FDA最新2024 SED-2023检查清单
  • 避坑指南:AT32F403A USB MSC时钟配置的那些坑(V2库版)
  • 视觉认知数据集构建与推理链生成技术解析
  • 避坑指南:在Ubuntu 20.04/ROS Noetic上搞定Rotors Simulator(附常见编译错误解决)
  • 3步突破限制:在VMware中运行macOS的完整解决方案
  • Switch大气层整合包终极指南:5步解锁游戏新境界
  • 【新人零基础学 】OpenClaw 2.6.6 配置 Ollama 本地服务详解(含安装包)
  • 告别网盘限速:如何通过本地解析技术实现多平台文件高速下载
  • Mamba-3 在金融时序预测中的应用:从理论到 PyTorch 实现
  • 2.4.3 集群模式运行Spark项目
  • 保姆级教程:用Python和pylidc库搞定LIDC-IDRI数据集预处理(从DICOM到2D切片)
  • 外网远程访问树莓派 — 超级详细新手教程(Tailscale方案)
  • ASIC与SOC核心技术差异及选型指南
  • Vin象棋:5分钟掌握基于YOLOv5的中国象棋AI连线工具终极指南
  • 为什么92%的Python跨端项目在macOS M-series上编译失败?Apple Silicon专用符号表修复方案曝光
  • 如何用WebPlotDigitizer快速从图表图像中提取数据:完整指南
  • 3步快速解锁鸣潮120FPS:WaveTools开源工具箱帧率优化指南
  • 长春本土资深写字间托管服务商核心能力全景呈现 - 奔跑123
  • Cocos Creator 实现汉字找茬小游戏(完整源码 可直接上线)
  • applera1n终极指南:解锁iOS设备激活锁的深度技术解析
  • 告别卡顿:深入 SystemUI 的 Dagger2 依赖注入,如何优化你的大型 Android 应用架构
  • 5分钟免费搭建你的第二大脑:Zettelkasten卡片盒笔记系统终极指南
  • python gunicorn
  • 体验Taotoken控制台在API密钥管理与访问控制上的便捷性
  • 保姆级教程:给你的Python requests加上‘网络韧性’,告别烦人的Retry Warning
  • golang如何实现即时通讯IM系统_golang即时通讯IM系统实现方案
  • 用LabVIEW给ESP32做个远程监控面板:TCP通信+OLED显示温度(附完整Arduino代码)
  • OpenClaw 2.6.6 安装避坑 + 必装技能 新手入门教程