写点什么

使用 Sanic 框架进行 Python Web 开发

作者:宇宙之一粟
  • 2022 年 4 月 15 日
  • 本文字数:1827 字

    阅读完需:约 6 分钟

使用 Sanic 框架进行 Python Web 开发

asyncio 模块

作为一款异步 Python 3.7+ web 框架,Sanic 最基本的构建块是 Python 标准库中的 asyncio 模块


2014 年初发布的 Python 3.4 是在新添加的 asyncio 模块中将协程概念引入标准库的第一步。 使用标准的 Python 生成器,可以在发生其他事情时暂停函数的执行,然后可以将数据注入该函数以使其恢复执行。 如果那时有一个对象“循环”通过需要工作的任务列表,我们可以同时进入和退出多个函数的执行。 这可以在单个线程中实现“并发”,并且是 asyncio 思想的基础。


快速浏览一下 Python 3.4 中的异步编程是什么样的:


import asyncio

@asyncio.coroutinedef get_value(): yield from asyncio.sleep(1) return 123
@asyncio.coroutinedef slow_operation(): value = yield from get_value() print(">>", value) loop = asyncio.get_event_loop()loop.run_until_complete(slow_operation())loop.close()
复制代码


运行结果:DeprecationWarning: "@coroutine" decorator is deprecated since Python 3.8, use "async def" instead,可以看到 Python 3.8 中这种使用方式被取消了。


现在的用法是使用 async def 开头:


import asyncioimport time
async def say_after(delay, what): await asyncio.sleep(delay) print(what)
async def main(): print(f"started at {time.strftime('%X')}")
await say_after(1, 'hello') await say_after(2, 'world')
print(f"finished at {time.strftime('%X')}")
asyncio.run(main())
复制代码


输出结果:


started at 23:39:52helloworldfinished at 23:39:55
复制代码


新的 asyncio 模块的语言和语法都非常强大,但有点笨拙。 对于经验不足的 Python 开发人员来说,生成器通常有点神秘和困难。 收益究竟来自什么? 这东西对很多人来说都是陌生的; Python 需要更好的语法。

Sanic 框架

经典的 Django 和 Flask 是一种同步的框架,而没有一种异步框架。


2016 年夏天,Sanic 的诞生就是为了探索这个差距。 这个想法很简单:我们可以从 Flask 中获取一个带有看起来很简单的 API 的应用程序并使其异步/等待吗?


不知何故,这个想法起飞并获得了认可。 这不是一个最初以重做 Python 应用程序处理 Web 请求的方式为目标的项目。 这在很大程度上是一个意外暴露的案例。 该项目迅速爆发并引起了轰动。 让 Flask 采用这种新模式有很大的吸引力。 但是,由于 Flask 本身无法做到这一点,所以很多人认为 Sanic 可能是 Flask 的异步版本。


开发人员很高兴有机会使用最新的 Python 为他们的应用程序带来全新的性能水平。



Sanic 的目的:提供一个简单的方法来启动和运行一个高性能的 HTTP 服务器,该服务器易于构建、扩展,并最终扩展。


Sanic 的口号是。"快速建设。快速运行"(Build fast.Run fast)。这当然强调了项目的性能导向。它也说明了一个目标,即在 Sanic 中构建一个应用程序是为了让人感到直观。启动和运行一个应用程序不应该意味着要学习一套复杂的 API,并且要不断地打开第二个浏览器窗口查看文档。当其他工具大量使用 "黑匣子 "式的功能,如全局变量、"魔法 "导入和猴子补丁时,Sanic 通常更倾向于朝编写好的、干净的和习惯性的 Python(又称 pythonic 代码)方向发展。如果你知道 Python,你可以用 Sanic 构建一个网络 API。


比如我们来看一个简单的 Hello World 例子。

Hello World Example

首先使用 pip3 install sanic 命令安装 sanic 模块。


Installing collected packages: aiofiles, websockets, httptools, sanic-routing, multidict, sanicSuccessfully installed aiofiles-0.8.0 httptools-0.4.0 multidict-6.0.2 sanic-22.3.0 sanic-routing-22.3.0 websockets-10.2
复制代码


Sanic() 是最基础的组成部分,通常我们会在一个名为 server.py 的文件中将其实例化,当然文件名称并不是必须的, 但是我们还是推荐使用 server.py 做为文件名称来实例化 Sanic 对象。


from sanic import Sanicfrom sanic.response import json
app = Sanic("MyHelloworldapp")
@app.route('/')async def test(request): return json({'hello': 'world'})
if __name__ == '__main__': app.run()
复制代码


Sanic 通过 sanic server.app 命令来运行:



然后我们访问:http://127.0.0.1:8000,就能访问到服务器返回的 json 数据,如下界面:



至此,我们一个简单的 Hello World 应用就完成了。


请继续跟着我来探索后续如何利用这款异步框架做点有意思的内容吧。


最后附上官网链接:https://sanic.dev/zh/

发布于: 刚刚阅读数: 5
用户头像

宇宙古今无有穷期,一生不过须臾,当思奋争 2020.05.07 加入

🏆InfoQ写作平台-第二季签约作者 🏆 混迹于江湖,江湖却没有我的影子 热爱技术,专注于后端全栈,轻易不换岗 拒绝内卷,工作于软件工程师,弹性不加班 热衷分享,执着于阅读写作,佛系不水文

评论

发布
暂无评论
使用 Sanic 框架进行 Python Web 开发_Python_宇宙之一粟_InfoQ写作平台