Flask 2.0 版本发布
本文已获李辉授权转载。
原文地址:https://greyli.com/flask2/
Flask 以及 Flask 依赖的 5 个 Pallets 项目都在今天发布了新的主版本(下面的链接指向各个项目的主版本变动日志):
你可以使用下面的命令更新 Flask:
pip install -U flask
如果你使用的国内 PyPI 镜像还没有同步最新版本,可以通过下面的命令临时切换到官方 PyPI 源:
pip install -U flask -i https://pypi.org/simple/
这篇文章会介绍一些 Flask 新增的特性,完整的变动可以参考上面各个项目的变动日志。
三个核心特性
嵌套蓝本(#3923)
对于一个比较大的项目,一般会使用蓝本来组织不同的模块。而如果你的项目非常大,那么嵌套蓝本就可以派上用场了。借助嵌套蓝本支持,你可以在某个蓝本之再创建多个子蓝本,对项目进行多层模块化组织(而且支持无限嵌套,你可以嵌套很多层):
parent = Blueprint("parent", __name__) # 创建父蓝本
child = Blueprint("child", __name__) # 创建子蓝本
parent.register_blueprint(child, url_prefix="/child") # 把子蓝本注册到父蓝本上
app.register_blueprint(parent, url_prefix="/parent") # 把父蓝本注册到程序实例上
这样在生成子蓝本的 URL 时需要传入完整的端点链:
url_for('parent.child.create')
/parent/child/create
这个特性来源于一个 2012 年创建的 feature request issue。
基本的 async/await 支持(#3412)
Flask 2.0 带来了基本的异步支持,现在你可以定义异步视图(以及异步错误处理函数、异步请求钩子函数):
import asyncio
from flask import Flask
app = Flask(__name__)
@app.route('/')
async def say_hello():
await asyncio.sleep(1)
return {'message': 'Hello!'}
注意要先安装额外依赖:
pip install -U flask[async]
顺便说一句,如果你在 Windows 上使用 Python 3.8,那么会有一个来自 Python 或 asgiref 的 bug 导致出错:ValueError: set_wakeup_fd only works in main thread。可以通过下面两种方式(任选一种)处理(具体参考这个 SO 回答):
- 升级到 Python 3.9
- 在你的入口脚本顶部添加临时修复代码:
# top of the file
import sys, asyncio
if sys.platform == "win32" and (3, 8, 0) <= sys.version_info < (3, 9, 0)::
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
不过目前只是一个基于 asgiref 的异步实现,作为异步支持的第一步,后续还会进行更多的优化和改进,更多相关信息可以参考文档。
快捷路由装饰器(#3907)
新增了下面的快捷路由装饰器:
app.get()app.post()app.delete()app.put()app.patch()
举例来说,使用 app.post() 等同于 app.route(methods=['POST']):
from flask import Flask
app = Flask(__name__)
@app.post('/')
def index():
return {'message': 'Hello!'}
注意不要在这些快捷装饰器里传入 methods 参数。如果需要在单个视图处理多个方法的请求,使用 app.route()。
我在某次 pallets 会议上提议添加这些装饰器时一开始是被拒绝的,后来 Phil Jones 创建了 #3907 经过二次讨论后才最终合并(被拒绝后我就把当时正在开发的 APIFlask 从扩展改成了继承 Flask 基类的框架,然后加了这些装饰器)。
我添加的三个特性
修复执行 flask run 找不到程序的奇怪设定(#3560)
这个像 bug 又像是 feature 的设定我在《一个困扰我两年的 Flask「Bug」》里详细说过,最终终于在两年后修复了。
支持在 .flaskenv 和 .env 文件里写中文(#3932)
我在《Flask Web 开发实战》第一章介绍 .flaskenv 文件时给了一个示例,演示如何添加注释:
SOME_VAR=1
# 这是注释
但这个示例没有实际测试……加了中文其实会报错,后来有两次收到读者反馈,最终终于在三年后修复了。
为文档添加命令切换面板(#3714)
这个或许算不上特性,不过在我看来是对用户非常友好的变动。除了个别不需要区分操作系统和命令行程序的命令外,我给文档里所有的命令添加了支持切换 Bash/CMD/Powershell 以及 macOS/Linux/Windows 的切换面板(面板的样式后续会有一些优化):
其他的有用特性
- 优化了浏览器缓存控制,对 CSS、图片等静态文件做出的变动会在程序重载后立刻更新,不再需要手动清除页面缓存。
- Werkzeug 的 multipart 解析(尤其是大文件上传处理)性能提高了 15 倍。
- 配置对象增加
Config.from_file()方法支持从任意文件加载器导入配置(比如toml.load、json.load),未来会取代Config.from_json()方法。 - 在使用环境变量
FLASK_APP指定工厂函数时支持传入关键字参数。 flask shell支持 tab 和历史补全(需要安装readline)。- CLI 系统优化了找不到程序时的错误处理和错误输出显示,同时修正了 Windows 上的命令行颜色输出。
破坏性变动
主要的破坏性变动(breaking change)是意外的把 send_from_directory() 函数的第二个参数名称直接由 filename 重命名为 path,将会在 2.0.1 加回来(#4019)。
另外 send_file() 函数的三个参数也进行了重命名(旧名称将在 2.1.0 移除):
attachment_filename->download_namecache_timeout->max_ageadd_etags->etag
其他重要变化
- 不再支持 Python 2 和 Python 3.5。
- 所有 Pallets 项目都添加了 type hinting,这意味着更好的 IDE 自动补全体验。
- 所有仓库的主分支由 master 改为 main。如果你在本地克隆了 Flask 等仓库,可以使用下面的命令来更新:
git branch -m master main
git fetch origin
git branch -u origin/main main
git remote set-head origin -a
感谢支持
这次更新对于整个 Pallets 项目来说是一个新的里程碑。接下来还有许多事情要做:FlaskCon 2021 正在准备中,新建立的 Flask 社区工作小组(Flask Community Work Group)正在进行 Flask 文档翻译(如果你对中文翻译感兴趣,可以订阅这个讨论)、被遗弃扩展收容计划(这是我一直想做的事情)等等。感谢支持,敬请期待!
欢迎通过下列途径关注 Pallets 项目:
- 关注 Twitter @PalletsTeam
- 订阅 Pallets 博客 RSS
- 加入 Pallets Discord 服务器
- 在 GitHub 点击 Watch 按钮关注项目动态
相关文章:
- New Major Versions Released! Flask 2.0, Werkzeug 2.0, and more – Pallets Blog
- Flask 2.0 – Talk Python Podcast
- 比修 Typo 还简单的开源贡献方式
- 写作一本技术书,能给一个社区带来哪些改变?
本条目发布于2021年5月12日。属于计算机与编程分类,被贴了 Flask、Flask2、Pallets 标签。
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Cocos Creator 3.1.0 发布
Cocos Creator 3.1 现已发布。Creator 3.0 统一了 2D 与 3D 的开发工作流,兼顾了轻量与重度游戏的开发体验,融合了几乎所有 Creator 2.x 与 Creator 3D 1.x 版本的功能。而 3.1 与 3.0 版本相比,增加了许多新功能,各方面性能也得到了优化。 主要更新内容 添加了延迟渲染管道,用户可以在项目设置中选择延迟渲染管道: 引入多线程渲染架构。Creator 在 v3.1中初步将传统的单线程架构拆分为两个主线程,一个是渲染线程,一个是设备线程。除了主线程的拆分,Creator 还将命令缓冲区的提交过程并行化,以加快渲染效率。多线程的渲染架构图如下: 增加了 PhysX 物理支持,目前支持除 Android x86 以外的原生平台,在 iOS上 的性能提升超过100%(如果需要在网络平台上预览,可以参考 example-3d 中的 physics-3d 项目,主要内容在预览-模板文件夹中修改)。 编辑器现在支持骨骼八面体显示,用户可以直观地看到模型骨骼的分布状态。 支持在 FBX/glTF 资源的检查器上预览动画。 更新了曲线编辑器,支...
-
下一篇
PostgreSQL 同时发布多个版本更新
PostgreSQL13.3、12.7、11.12、10.17 和 9.6.22 现已发布,这些版本关闭了三个安全漏洞,并修复了过去三个月中报告的 45 个以上的 bug。 主要更新内容 关闭 CVE-2021-32027:数组下标计算中的整数溢出导致缓冲区溢出。受影响的版本:9.6 - 13。在修改某些 SQL 数组值时,缺失的边界检查让认证的数据库用户向服务器内存的大范围内写入任意字节。 关闭 CVE-2021-32028:INSERT ... ON CONFLICT ... DO UPDATE 中的内存泄露。受影响的版本:9.6 - 13。该功能首次出现在9.5中。在一个特意制作的表中使用 INSERT ... ON CONFLICT ... DO UPDATE 命令,攻击者可以读取服务器内存的任意字节。在默认配置中,任何经过认证的数据库用户都可以创建先决条件的对象,并完成这种攻击。 关闭 CVE-2021-32029:分区表 UPDATE ... RETURNING 中的内存泄露。受影响的版本: 11 - 13。在一个特意制作的分区表上使用 UPDATE ... RETURNI...
相关文章
文章评论
共有0条评论来说两句吧...


微信收款码
支付宝收款码