记一次用Python的ast模块将Flask项目转为Quart的尝试

本文记录了一次尝试使用Python的ast模块将基于Flask的项目转换为支持异步操作的Quart框架的过程。在迁移过程中,通过全局替换和Extension替换实现了大部分工作,但在处理异步请求时遇到挑战。通过元编程,利用ast模块解析和修改AST,实现了自动化转换,解决了Flask到Quart的异步问题。尽管转换后的代码存在一些局限性,但这是一个有趣的实践,可能对其他开发者有所启发。
摘要由CSDN通过智能技术生成

背景

对这一串背景不感兴趣的同志们可以直接跳到 实现 部分或者 结果 部分。

不久前,OpenAI 正式宣布了 TTS 模型的正式放出,我也在第一时间尝试为我的小应用 译站 接入对应的功能。接入是在后端完成,而我目前用的后端框架是 Flask。

但当我开始写代码时,却发现了一个严重的问题:我希望做到流处理生成,而 openai 模块提供的对应函数定义为:

@override
async def aiter_bytes(self, chunk_size: Optional[int] = None) -> AsyncIterator[bytes]:
    return self.response.aiter_bytes(chunk_size)

如上图,这是一个 async 函数,而其返回的内容也是异步迭代器;而 Flask 是一个基于 WSGI 的框架,其不支持异步操作(准确的说,是没法直接迭代异步迭代器来做流式返回)。在历经了几天将 AsyncGenertor 转化成 Generator 的失败尝试后,我最终决定直接更换框架。所幸,我找到了 Quart

Quart 是一个基于 ASGI(Asynchronous Server Gateway Interface)的框架,其 API 与 Flask 几乎完全相同,但其支持异步操作。

在完成代码的备份后,我开始了迁移。

迁移

全局替换

首先,我将所有的 flask 替换成 quart,并将 Flask 替换成 Quart。这一步是最简单的,因为 Quart 的 API 与 Flask 的 API 几乎完全相同,也就是说,对于原本的项目导入:

from flask import Flask, request, jsonify

app = Flask(__name__)

只需要将其替换为:

from quart import Quart, request, jsonify

app = Quart(__name__)

即可。这一步直接在 VSCode 中完成。

一些 Extension 的替换

项目中用到了一些 Flask 的 Extension,比如 flask_corsflask_jwt_extended 等,经过一番查询后,发现这些 Extension 很多都有对应的 Quart 版本,参考 Quart Extensions 找到对应的替换,按 README 中的说明进行替换即可。很多 Extension 也都保持了与 Flask 版本相同的 API,所以替换起来也很简单。

问题

本来以为到这儿,大头就完成了。没想到这才是一切的开始。当我运行项目时,却发现了一个问题:Quart 的 request 对象与 Flask 的 request 对象不同,很多 flask 原本的属性,在 Quart 中变成了 awaitable 的!官方 给出的列表如下:

await request.data
await request.get_json()
await request.form
await request.files
await render_template()
await render_template_string()

也就是说,对于原本的代码

# Flask
@bp_api.route("/")
def test():
    a: int = int(request.form.get("a", 0))
    try:
        return render_template("index.html")
    except Exception as e:
        return make_response(f"error, {e}")

在 Quart 中,需要改写为:

# Quart
@bp_api.route("/")
async def test():
    form = await request.form
    a: int = int(form.get("a", 0))
    try:
        return await render_template("
  • 10
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值