# Version 22.3

# 介绍(Introduction)

22.3 版本是 22 版本周期中的第一个版本。所有的标准 SCO 库现在都进入了相同的发布周期,并将遵循相同的版本控制模式。包括:

# 更新内容(What to know)

更多细节详见发布说明 (opens new window)。以下是值得注意的新功能或突破性变化,以及更新内容...

# 多应用服务(Application multi-serve)

Sanic 新增了一个 API,允许您在同一个进程上并行运行多个应用。通过 app.prepare(...) 将不同的应用一次或多次绑定到唯一的主机端口上。最后再通过 Sanic.server() 来运行应用程序。

app = Sanic("One")
app2 = Sanic("Two")
app.prepare(port=9999)
app.prepare(port=9998)
app.prepare(port=9997)
app2.prepare(port=8888)
app2.prepare(port=8887)
Sanic.serve()

在上面的代码片段中,两个应用程序将会在多个不同的端口上并发运行。CIL 客户端当前暂不支持该功能。

这种模式依旧依赖了 app.run,不过 app.run 是上述模式的简写,app.run 方法不会被弃用,依旧会得到完整的维护。

# 👶 BETA 功能 - 新的路由参数类型: 文件名和拓展名

一种常见的开发模式是创建一个动态生成文件的路由。端点用于匹配带有扩展名的文件。有一个新的路径参数来匹配文件: <foo:ext>

@app.get("/path/to/<filename:ext>")
async def handler(request, filename, ext):
    ...

这将捕获任何以文件扩展名结尾的模式。但是,您可能希望通过指定扩展名以及对文件名使用其他路径参数类型来扩展它。

例如您只想捕获文件名为纯数字的 .jpg 文件:

@app.get("/path/to/<filename=int:ext=jpg>")
async def handler(request, filename, ext):
    ...

下面是一些常用的匹配例子:

路由定义 示例 文件名 拓展名
<file:ext> page.txt "page" "txt"
<file:ext=jpg> cat.jpg "cat" "jpg"
<file:ext=jpg|png|gif|svg> cat.jpg "cat" "jpg"
<file=int:ext> 123.txt 123 "txt"
<file=int:ext=jpg|png|gif|svg> 123.svg 123 "svg"
<file=float:ext=tar.gz> 3.14.tar.gz 3.14 "tar.gz"

# 🚨 突破性变化 - 非空字符串的路径参数匹配

动态路径参数只能匹配非空字符串。

以前,带有动态字符串参数 (/<foo >/<foo:str>) 的路由可以匹配任何字符串,包括空字符串。它现在将只匹配一个非空字符串。要保留旧的行为,应该使用新的参数类型: /< foo:stroempty >

@app.get("/path/to/<foo:strorempty>")
async def handler(request, foo)
    ...

# 🚨 突破性变化 - sanic.worker.GunicornWorker 现已被移除

不同于正常流程下的弃用策略,为了支持使 Sanic 支持多服务,我们在升级过程中删除了 GunicornWorker 类,因为即便它存在,也不是部署 Sanic 的最佳策略。

如果您想使用 gunicorn 部署 Sanic,那么建议您使用 uvicorn (opens new window)。它可以有效的将 unicorn 作为 ASGI 应用程序来运行。您可以通过安装 uvicorn 升级到此模式:

pip install uvicorn

然后您应该按照下面的方式来运行它:

gunicorn path.to.sanic:app -k uvicorn.workers.UvicornWorker

# 认证头解析(Authorization header parsing)

目前, Authorization 标头已经可以进行解析。您已经能够使用 request.token 来访问以下两种形式之一的报文:

Authorization: Token <SOME TOKEN HERE>
Authorization: Bearer <SOME TOKEN HERE>

Sanic 现在可以解析更多的凭证类型,如 BASIC:

Authorization: Basic Z2lsLWJhdGVzOnBhc3N3b3JkMTIz

它现在可以通过 request.credentials 来进行访问:

print(request.credentials)
# Credentials(auth_type='Basic', token='Z2lsLWJhdGVzOnBhc3N3b3JkMTIz', _username='gil-bates', _password='password123')

# 选择性的将 CLI 参数注入到工厂类中。

如果您正在以工厂类的方式使用 Sanic,Sanic 将尝试将解析后的 CLI 参数注入到您的工厂类中。

def create_app(args):
    app = Sanic("MyApp")
    print(args)
    return app
$sanic p:create_app --factory
Namespace(module='p:create_app', factory=True, simple=False, host='127.0.0.1', port=8000, unix='', cert=None, key=None, tls=None, tlshost=False, workers=1, fast=False, access_log=False, debug=False, auto_reload=False, path=None, dev=False, motd=True, verbosity=None, noisy_exceptions=False)

如果您使用 -factory 运行 CLI,您还可以选择向命令传递任意参数,这些参数将被注入到参数 Namespace 中。

sanic p:create_app --factory --foo=bar
Namespace(module='p:create_app', factory=True, simple=False, host='127.0.0.1', port=8000, unix='', cert=None, key=None, tls=None, tlshost=False, workers=1, fast=False, access_log=False, debug=False, auto_reload=False, path=None, dev=False, motd=True, verbosity=None, noisy_exceptions=False, foo='bar')

# 全新的应用程序重载监听事件

当您使用自动重载功能运行 Sanic 服务时,在重载时会触发两个新的监听器:

  • reload_process_start
  • reload_process_stop

他们只在重载时生效。

@app.reload_process_start
async def reload_start(*_):
    print(">>>>>> reload_start <<<<<<")
@app.reload_process_stop
async def reload_stop(*_):
    print(">>>>>> reload_stop <<<<<<")

# 监听器不再需要 loop 参数

现在,您可以在您的监听器函数中抛弃 loop 参数了,按照下面的两种方式来声明监听器函数都是可行的方法:

@app.before_server_start
async def without(app):
    ...
@app.before_server_start
async def with(app, loop):
    ...

# 功能迁移 - 调试模式不再自动开启重载功能

使用 -debugdebug=True 运行时,Sanic 服务器不会自动启动自动重装程序。这种在调试时同时执行这两项操作的功能在 v21 中被弃用,并在此版本中被删除。如果你想同时拥有调试模式和自动重载,你可以使用 -dev 或者 dev=True

开发模式 = 调试模式 + 自动重载

# 功能弃用 - 加载小写的环境变量

在以前的版本中,Sanic 加载环境变量时,只要能够完全匹配就不会区分大小写。但是一般情况下环境变量应该是完全大写的,所以该功能已被提上弃用日程,如果环境变量不是完全大写的,您将会收到一条警告。加载非大写的环境变量功能将在 v22.9 版本中彻底移除。

# 新闻(News)

# Packt 出版了 《Sanic web 开发》 的新书

@ahopkins (opens new window) 主笔, SCO 认证的新书 《Sanic Web 开发》现已发布。该书的收入将按照一定的比例捐赠给 SCO ,用于 Sanic 的进一步发展。

您可以通过 sanicbook.com (opens new window) 来了解更多详细信息。

Python Web Development with Sanic

# 鸣谢(Thank you)

感谢每一位参与本次发布的人:👏

@aaugustin (opens new window) @ahopkins (opens new window) @ashleysommer (opens new window) @cansarigol3megawatt (opens new window) @ChihweiLHBird (opens new window) @gluhar2006 (opens new window) @komar007 (opens new window) @ombe1229 (opens new window) @prryplatypus (opens new window) @SaidBySolo (opens new window) @Tronic (opens new window) @vltr (opens new window)

并且,特别感谢 @ConnorZhang (opens new window)@ZinkLu (opens new window),他们在同步翻译最新中文文档上付出了巨大精力。


如果您喜欢本项目,请考虑参与建设本项目。我们欢迎您提交代码,也欢迎您以任何其他方式来参与本项目的建设。比如撰写文档,分享使用心得,参与社区讨论,当然,如果经济允许,您也可以考虑经济资助 (opens new window)

MIT Licensed
Copyright © 2018-present Sanic Community Organization

~ Made with ❤️ and ☕️ ~