【Quart 框架——来源于Flask的强大且灵活的异步Web框架】

目录


前言

Quart 是一个基于 Python 的异步 Web 框架,灵感来自 Flask。它结合了 Flask 的易用性和成熟度,并添加了对 Python 异步特性的支持。

一、Quart简介

1-1、简介

Quart 是一个基于 Python 的异步 Web 框架,灵感来自 Flask。它结合了 Flask 的易用性和成熟度,并添加了对 Python 异步特性的支持。使用Quart你可以

  • 渲染和提供HTML模板
  • 构建Json API
  • 服务WebScoket
  • 流式请求、响应。

Quart 旨在提供一个类似于 Flask 的简单且灵活的 Web 框架,同时支持 Python 的异步功能(async 和 await)。这使得 Quart 能够处理高并发和异步 I/O 操作,适用于需要处理大量并发连接的应用程序,如实时 Web 应用和微服务。

1-2、与flask的区别

  • 异步支持:Quart 的最大特点是对异步操作的支持,而 Flask 主要是同步的。
  • WebSockets:Quart 内置对 WebSockets 的支持,而 Flask 需要使用 Flask-SocketIO 扩展。
  • 路由定义:Quart 的路由定义和 Flask 基本一致,但 Quart 的路由处理函数可以是异步的。

二、快速开始

2-1、安装

安装: python的版本必须大于3.8。

c 复制代码
pip install quart
pip install python

2-2、基本用法

c 复制代码
from quart import Quart, render_template, websocket

app = Quart(__name__)

@app.route("/")
async def hello():
    return await render_template("index.html")

@app.route("/api")
async def json():
    return {"hello": "world"}

@app.websocket("/ws")
async def ws():
    while True:
        await websocket.send("hello")
        await websocket.send_json({"hello": "world"})

if __name__ == "__main__":
    app.run()

三、核心功能

3-1、异步路由

Quart 允许你定义异步路由处理函数,使得处理异步 I/O 操作更加高效。

c 复制代码
@app.route('/async')
async def async_route():
    # 异步操作
    await asyncio.sleep(1)
    return 'This is an async route'

3-2、WebSockets 支持

Quart 内置对 WebSockets 的支持,可以轻松处理实时通信。

c 复制代码
from quart import websocket

@app.route('/ws')
async def ws():
    while True:
        message = await websocket.receive()
        await websocket.send(f'You said: {message}')

3-3、中间件

Quart 支持中间件,可以在请求处理之前或之后执行一些操作。

c 复制代码
@app.before_request
async def before_request():
    print("This runs before each request")

@app.after_request
async def after_request(response):
    print("This runs after each request")
    return response

3-4、蓝图 (Blueprints)

Quart 支持蓝图,用于模块化应用程序的路由和视图。

c 复制代码
from quart import Blueprint

bp = Blueprint('example', __name__)

@bp.route('/example')
async def example():
    return 'This is an example route'

app.register_blueprint(bp, url_prefix='/bp')

四、部署

4-1、使用uvicorn部署

安装:

c 复制代码
pip install uvicorn

运行: 在项目根目录下运行以下命令,这里 app:app 表示在 app.py 文件中有一个名为 app 的 Quart 应用实例。

c 复制代码
uvicorn app:app

4-2、使用hypercorn部署

安装:

c 复制代码
pip install hypercorn

部署: 指定端口和启用自动重载

c 复制代码
hypercorn app:app --bind 0.0.0.0:8000 --reload

五、案例分析

概述:这段代码创建了一个基于 Quart 框架的异步 Web 应用程序,暴露了一个 POST 接口 /aiops。该接口接收 JSON 请求,提取其中的 prompt 字段,并调用 run_query 函数处理这个 prompt。主要功能如下:

  • logger.add('app.log') 记录日志到app.log
  • 禁用 Quart 和 werkzeug 的默认日志,以避免日志冗余。
  • 定义名为aiops的post路由并且构建异步处理函数
  • 异步获取请求中的json数据
c 复制代码
from quart import Quart, request, jsonify
from querySLSLog import run_query
from loguru import logger
import logging
from querySLSLog import run_query

app = Quart(__name__)

logger.add('app.log')
app.logger.disabled = True
werkzeug_logger = logging.getLogger('werkzeug')
werkzeug_logger.disabled = True


@app.route('/aiops', methods=['POST'])
async def run_code():

    data = await request.json
    prompt = data.get('prompt')
    if not prompt:
        logger.error(f"提取prompt失败: {request.data.decode('utf-8')}")
        return jsonify({'error': 'No prompt provided'}), 400
    
    logger.info(f"prompt: {prompt}")

    try:
        result = await run_query(prompt)
        logger.info(f"result: {result}")
        result = result.content
        return jsonify(result)
    except Exception as e:
        error = f"调用run_query方法失败: {e}"
        logger.error(error)
        return jsonify(error)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=6789)

参考文章:

Quart

总结

Quart 是一个强大且灵活的异步 Web 框架,适用于需要高并发和异步 I/O 操作的应用程序。它结合了 Flask 的简单性和 Python 异步特性的优势,是开发现代 Web 应用和微服务的一个有力工具。

相关推荐
玩电脑的辣条哥3 小时前
Python如何播放本地音乐并在web页面播放
开发语言·前端·python
ew452183 小时前
ElementUI表格表头自定义添加checkbox,点击选中样式不生效
前端·javascript·elementui
suibian52353 小时前
AI时代:前端开发的职业发展路径拓宽
前端·人工智能
Moon.93 小时前
el-table的hasChildren不生效?子级没数据还显示箭头号?树形数据无法展开和收缩
前端·vue.js·html
垚垚 Securify 前沿站3 小时前
深入了解 AppScan 工具的使用:筑牢 Web 应用安全防线
运维·前端·网络·安全·web安全·系统安全
工业甲酰苯胺6 小时前
Vue3 基础概念与环境搭建
前端·javascript·vue.js
mosquito_lover17 小时前
怎么把pyqt界面做的像web一样漂亮
前端·python·pyqt
柴柴的小记9 小时前
前端vue引入特殊字体不生效
前端·javascript·vue.js
柠檬豆腐脑10 小时前
从前端到全栈:新闻管理系统及多个应用端展示
前端·全栈
bin915310 小时前
DeepSeek 助力 Vue 开发:打造丝滑的颜色选择器(Color Picker)
前端·javascript·vue.js·ecmascript·deepseek