使用 Sanic 框架进行 Python Web 开发

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

asyncio 模块

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


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


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

import asyncio
@asyncio.coroutine
def get_value():
    yield from asyncio.sleep(1)
    return 123
@asyncio.coroutine
def 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 asyncio
import 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:52
hello
world
finished at 23:39:55


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

Sanic 框架

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


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


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


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


image.png


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, sanic
Successfully 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 Sanic
from 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 命令来运行:


image.png


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


image.png


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


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

相关文章
|
12月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
806 4
|
12月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
807 0
|
12月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
826 1
|
12月前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
843 0
|
12月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
526 0
|
12月前
|
开发框架 前端开发 Go
【GoGin】(0)基于Go的WEB开发框架,GO Gin是什么?怎么启动?本文给你答案
Gin:Go语言编写的Web框架,以更好的性能实现类似Martini框架的APInet/http、Beego:开源的高性能Go语言Web框架、Iris:最快的Go语言Web框架,完备的MVC支持。
838 1
|
设计模式 人工智能 API
AI智能体开发实战:17种核心架构模式详解与Python代码实现
本文系统解析17种智能体架构设计模式,涵盖多智能体协作、思维树、反思优化与工具调用等核心范式,结合LangChain与LangGraph实现代码工作流,并通过真实案例验证效果,助力构建高效AI系统。
1191 7
|
存储 JavaScript NoSQL
构建高效Web应用:使用Node.js和Express框架
【8月更文挑战第30天】本文将引导你了解如何使用Node.js和Express框架快速搭建一个高效的Web应用。通过实际的代码示例,我们将展示如何创建一个简单的API服务,并讨论如何利用中间件来增强应用功能。无论你是新手还是有经验的开发者,这篇文章都将为你提供有价值的见解。
|
Web App开发 JavaScript 前端开发
构建高效Web应用:Node.js与Express框架的深度整合
【9月更文挑战第28天】在现代Web开发领域,Node.js和Express框架的结合已成为打造高性能、易扩展应用的黄金组合。本文将深入探讨如何利用这一技术栈优化Web应用架构,提供具体实践指导,并分析其性能提升的内在机制。通过代码示例,我们将展示从基础搭建到高级功能的实现过程,旨在为开发者提供一条清晰的学习路径,以实现技术升级和项目效率的双重提升。
368 4
|
JSON JavaScript 前端开发
构建高效Web应用:Node.js与Express框架的完美结合
【9月更文挑战第28天】在现代Web开发中,Node.js和Express框架的结合为创建高性能、易扩展的应用提供了强有力的支持。本文将深入探讨如何利用这两种技术构建一个简单但功能强大的Web服务,同时提供代码示例以加深理解。

推荐镜像

更多