今天给大家介绍一个超好用的框架,迅速将Python函数变成API,它就是最近越来越火的异步Web框架Sanic。
1. Sanic简介
Sanic 是 Python3.7+ Web 服务器和 Web 框架,旨在提高性能。它允许使用 Python3.5 中添加的async/await
语法,这使得您的代码有效的避免阻塞从而达到提升响应速度的目的。
看到这里,可能你会注意到,Sanic的一个显著特性就是高性能,由于支持async/await
语法,它的执行速度会非常的快。
在GitHub上面有一个项目专门是给各种语言的web框架进行压测(传送门)。
框架 | 每秒处理请求数(64并发) | 每秒处理请求数(256并发) | 每秒处理请求数(512并发) |
---|---|---|---|
starlette (0.20) | 50,900 | 53,048 | 53,094 |
sanic (22.6) | 49,148 | 51,762 | 51,300 |
fastapi (0.81) | 34,192 | 36,866 | 36,668 |
falcon (3.1) | 22,122 | 21,606 | 21,323 |
flask (2.2) | 13,945 | 13,830 | 13,661 |
tornado (6.2) | 13,655 | 14,496 | 13,924 |
django (4.1) | 8,001 | 7,940 | 8,002 |
可以看出来,Sanic在常用的Python框架中,速度是处在领先地位的。
除了高性能之外,Sanic一个超方便的地方就是可以部署在生产环境,它自带了一个Web服务器,可以使用Run方法直接启动应用。当然除此之外,您还可以使用支持ASGI(Asynchronous Server Gateway Interface)应用的服务器来部署Sanic,或者使用Gunicorn.
在这里还要特别提一下Sanic的社区,Sanic的网站拥有完善的中文用户手册,该网站是由贡献者自主发起且受官方承认,由翻译者进行翻译贡献,由Sanic官方团队进行发布,很适合英文不太好的小伙伴阅读学习。
社区非常欢迎新的贡献者加入,可以在GitHub上面浏览标记好的问题,也可以在论坛上进行提问、讨论、解答。
2. 快速上手
首先,我们需要先安装Sanic框架。
pip install sanic
现在,来写一个Hello World
:
from sanic import Sanic
from sanic.response import text
app = Sanic("HelloWorld")
@app.get("/hello")
async def hello_world(request):
return text("Hello, this is my first app in Sancic framework.")
注意,必须使用response
或继承自response
的类作为相应类型。在许多其他框架中,它们允许您使用诸如return "Hello World"
或者return {"foo":"bar"}
的方式来进行返回,但是为了执行这类隐式调用,需要在响应流程中的某个位置花费大量的时间来确定您到底想要表达什么意思。因此,我们以轻松调用为代价,来提升服务的响应速度,Sanic会要求您对您的响应进行显式调用。
将上面的代码保存为HelloWorld.py,然后用下面命令执行,它会调用内置的Web服务器运行程序。
sanic HelloWorld.app
如果执行命令的时候遇到下面的报错,检查一下是否已经将脚本所在目录(通常为C:\Users%userid%\AppData\Roaming\Python\Python310\Scripts)放在环境变量中。
'sanic' is not recognized as an internal or external command,
operable program or batch file.
命令执行成功会出现下面的提示:
从提示中可以看出来,sanic模式是运行在生产模式,可以通过加启动参数--debug
或者--dev
用于开发模式。
现在我们来看看效果:
使用浏览器打开网址http://localhost:8000/hello
。
也可以使用其它API测试工具比如Postman来测试:
服务启动的默认端口是8000
,如果想要修改端口,可以使用启动参数或者代码中声明的方式。
启动参数指定端口
sanic HelloWorld.app --host=127.0.0.1 --port=7890
通过代码指定端口
app.run(host='127.0.0.1', port=7890)
run方法支持以下几个关键字参数:
参数名称 | 默认值 | 参数说明 |
---|---|---|
host | "127.0.0.1" | 服务器监听的地址。 |
port | 8000 | 服务器监听的端口。 |
unix | None | Unix套接字文件(不是TCP)。 |
debug | False | 开启DEBUG输出(降低服务器性能)。 |
ssl | None | SSLContext,子进程用于 SSL 加密。 |
sock | None | 服务器接受连接的套接字。 |
workers | 1 | 要生成的子进程数量。 |
loop | None | 一个兼容 asyncio 的事件循环。如果没有指定,Sanic 会创建自己的事件循环。 |
protocol | HttpProtocol | asyncio.protocol 子类。 |
access_log | True | 启用请求访问日志(显著降低服务器速度)。 |
可以使用python HellowWorld.py
来运行带有app.run(...)
方法的程序。
3. 实现Get和Post接口
Sanic通过注解来定义接口方法,用一个简单的加减运算作为例子。
from sanic import Sanic
from sanic.response import text, json
app = Sanic("HelloWorld")
@app.get("/add")
async def addXY(request):
parameters = request.args
x = float(parameters['x'][0])
y = float(parameters['y'][0])
result = str(x + y)
return text("The result is: " + result)
@app.post("minus")
async def minusXY(request):
parameters = request.json
x = float(parameters['x'])
y = float(parameters['y'])
result = x - y
return json({"Result": result})
app.run(host='127.0.0.1', port=7890)
使用Postman调用接口
以上,相信您已经对Sanic框架有了一个基本的了解,也掌握了快速搭建api接口以及测试的方法。如果大家觉得文章还不错的话,欢迎大家三连(点赞+在看+收藏)。