LWN:Pallets项目集的新版本!
共 4085字,需浏览 9分钟
·
2021-06-11 17:09
关注了就能看到更多这么棒的文章哦~
A bunch of releases from the Pallets projects
By Jake Edge
May 19, 2021
DeepL assisted translation
https://lwn.net/Articles/856518/
5 月 11 日,Python 实现的 Flask web microframework 项目发布了一个重要版本 Flask 2.0,但不仅如此。虽然 flask 可能过于光彩夺目吸引眼球了,但其实它是一批共同合作来为各种 web 开发提供解决方案的 library 中的一个。所有这些 library 在一起被称为 Pallets project。这是第一次把 Pallets 包含的所有六个 library 同时发布出来,并且每个 library 都是新发布了一个主要版本。这次的新版本抛弃了对 Python 2 的支持,同时也吸收了许多新东西。
Pallets
Flask 相当有名,以前也在 LWN 介绍过,但 Pallets 这个项目却有点不够知名,至少对我来说以前并不了解。Jinja2 template engine(模板引擎),是一个 Flask 中使用了的 Pallets 组件,它也是相当知名的,但其他几个 library 就不那么为人熟知了。唯一一个我还听说过的 library 就是支持 Web Server Gateway Interface(WSGI)application 的 Werkzeug 库,是用来连接 Flask 应用程序和 Web 服务器的。
Pallets 上还有三个 library,但规模都比较小,也比较专业。其中的 MarkupSafe 提供了一个文本对象,可以针对 HTML 来转义字符;ItsDangerous 则提供了用来在可信和不可信环境之间移动的数据进行加密签名的 helper 功能;还有命令行界面创建工具包(Command Line Interface Creation Kit),名为 Click,用于 "用尽量少的代码来组合起来创建漂亮的命令行界面"。统一协调后,正式版本发布是在 Pallets 博客上宣布的。它是基于过去两年的工作,尽管在这个时间段内还有其他一些主要版本(例如 2019 年 7 月的 Flask 1.1,2020 年 1 月的 Jinja 2.11,2020 年 2 月的 Werkzeug 1.0)。除了上面提到的 Flask 2.0,该版本还包括:
Werkzeug 2.0
Jinja 3.0
Click 8.0
ItsDangerous 2.0
MarkupSafe 2.0
所有这些项目现在都只支持 Python 3.6 及以上版本,这是 Pallets 早在 2019 年底就已经宣布的计划。"删除兼容性代码使得代码执行速度更快,同时也更容易维护和方便代码贡献者。" 另一个多个版本共同支持的功能是 type annotation,已经在这几个 library 中都得到了支持。除此之外还利用各种工具在整个代码库上采用了一致的代码风格。
Changes
Flask 支持了异步视图(asynchronous views)和 error handler,所以可以用 async def 来定义函数,Flask 会起一个单独的线程来运行此函数。目前还不完全清楚 Flask 针对 async 会增加多大程度的支持,因为 Quart 项目之前已经用 Flask API 提供了一个异步的 web framework。Quart 的开发者 Philip Jones 是 Pallets 的维护者之一,他在 2019 年写了一篇关于这个主题的博文,并在 GitHub 上提交了一个申请在 Flask 中实现 async 的 issue。
Blueprints 现在可以在 Flask 2.0 中嵌套使用了,这为管理各种 web application 提供了更多灵活性。开发模式下的服务程序(即通过 "flask run" 运行的)的 error handling 得到了改善,不会再推迟报出它启动时检测到的错误。"flask shell" 在 Flask 应用程序的上下文中提供了一个 Python 的 REPL 环境,现在如果启用了 Readline 的话就可以按 Tab 键补全。
Werkzeug 2.0 的几项重点更新使其可以更灵活地支持 async。本地变量会用 ContextVar 类型来管理,这样它们就可以在 coroutine 之间共享,而不仅仅是在线程之间共享了。Flask 的 Request 和 Response 这两个 class 进行了重构,删除了 BaseRequest/Response 这些父类,并将所有的混合工作移到这些(现在)基类中。此外,正在创建一个新的 API,从而可以从这些 class 中移除那些依赖于 WSGI 或 I/O 操作的代码。"这将使我们能够在未来更好地支持 sync 和 async 的使用场景"。具体来说,Quart 和其他异步服务器网关接口(ASGI)framework 也能使用 Werkzeug 了。
此外,从 Werkzeug 返回的许多 datetime 对象现在都可以支持时区了。用来上传文件的 multipart/form-data 的解析功能得到了显著改善,性能提高了 15 倍。URL routing 现在可以支持 WebSocket 方案了(ws://和 wss://);这个 library 没有直接支持 WebSocket,但这个功能就能允许 prect 使用 Werkzeug routing。
Jinja 3.0 版本发布之后,不需要打 patch 就可以支持 async 环境和 render 了。此外,NativeEnvironment(允许模板产生本地 Python 类型,而不仅仅是字符串)也被修改了,可以支持 async 环境。模板中的 block 现在可以被标记为 required,这意味着它们在模板层次结构中某个地方一定得定义这个 block。translation contexts(通过 pggettext 和 npgettext 使用)现在可以用来确定 i18n extension 中的字符串的翻译结果了。
Click 8.0 对参数处理进行了许多改进,这对一个构建命令行工具的 toolkit 来说是很有意义的。tab 补全功能也被完全重写了,从而允许每个 "command、group、parameter 和 type 支持自定义的补全";补全功能还有其他改进。支持使用 256 色调色板指定颜色或使用 RGB 值,以及支持了斜体、删除线和其他文本效果。帮助文本的格式得到了改进,针对用户的提示信息现在可以进行翻译了。
ItsDangerous 提供了一种易于使用的机制来对 cookie 值等东西进行签名,在 2.0 版本中增加了对 key rotation 的支持。可以传入一个密钥列表,按时间顺序排序,最新的一个将被用来进行签名,而验证签名时会尝试所有这些密钥。它的 datetime 对象也增加时区的支持。
MarkupSafe 2.0 为各种不同的 Python 版本、操作系统和体系架构增加了一系列的二进制支持,总共有 33 种组合。
上面这些概述仅仅触及了这些库中引起我的关注的一些改动。可以仔细看一下公告,以及非常详细的更新日志,会发现很多其他改进细节。
History
除了都是用来开发 Web application 的好用工具之外,Pallets 项目们还有一个共同点:它们都是由 Armin Ronacher 发起的,他在 Python 社区中一直是一个多产的贡献者。在他发表了一个愚人节笑话 并形成了 Flask 整整六年之后,他在一篇博文中介绍了 Pallets 项目:
2010 年 4 月 1 日,我发布了一个名为 denied 的玩笑性 microframework,它嘲笑了当时所有的那些不管理依赖关系并且将所需一切都塞在一个 Python 文件中的 microframework。我当时所做的就是将 Jinja2 和 Werkzeug 以 base64 编码的 zip 文件的形式塞到了 framework 中唯一的 Python 文件中。人们对它的反应很有趣,因为一方面,很多人并不真正理解这是一个愚人节的玩笑,另一方面,在另一个讨论中,没有一个微型框架真正使用 dependency 关系甚至鼓励使用。
一个月后,出现了一个名为 "Flask" 的新项目,它实际上就是认真实现了这个概念。它推出时的口号是 "基于 Werkzeug、Jinja 2 和良好意愿的 Python 微框架 ",六年后,它成为了 GitHub 上最受欢迎的 Python 框架。
今天,Ronacher 仍然参与在 Pallets 之中,还有和他一起创办 Pallets 的其他三个人,以及后来加入的更多人员,比如 Jones。这七个人自然得到了许多其他开发人员的支持。"参与人员的总名单要长得多,因为 Pallets 包含了多年来许多开发人员的无数贡献。" 与几乎所有的项目(或多个项目组合)一样,如果读者对某个 library 感兴趣,Pallets 将会非常欢迎更多贡献者加入进来。
全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。
长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~