行业知识
Sanic,一个快如闪电的异步 Python Web 框架
大家好!我是爱摸鱼的小鸿,关注我,收看每期的编程干货。
本篇文章将详细介绍 Python 高性能 Web 异步框架 Sanic 的各功能,并通过实战将爬虫(Spiders)模块+视图(Views)模块+路由(Routers)模块+模型(Models)模块结合形成一个各模块独立、高性能、可读性高、可扩展性高、具有精美的接口文档、易于后期维护的爬虫 API 项目,并部署在 Ubuntu 服务器上供团队调用。
目录
- 一、Sanic 简介及特性
- 二、Sanic 各功能测试
- 三、爬虫 API 实战项目
- 四、服务器部署及接口性能测试
- 五、作者Info
一、Sanic 简介及特性
说到 Python Web 框架, 你可能会想到 Flask、Django、Tornado、FastAPI这些;而本文将向大家介绍另一个 Python Web 框架 —— Sanic。
它是一个 Python 3.8+ Web 服务器和 Web 框架,旨在快速运行。它允许使用 Python 3.5 中添加的 async/await 语法,这使您的代码非阻塞且快速。
应用场景
如果你希望快速搭建一个小型的 API 项目,又对速度有非常大的需求,那 Sanic 无疑是你的天选框架,很哇塞的哟!
Sanic 特性
- 直接支持生产环境部署
- 高度可扩展
- 内置快速网络服务器
- 具有异步支持
- 使用 Redoc、Swagger 的 OpenAPI 文档
- CORS 保护等
二、Sanic 各功能测试
快速上手
先来快速构建一个简单的 Python Web 应用:
from sanic import Sanicfrom sanic.response import jsonfrom datetime import datetimeimport multiprocessingapp = Sanic("SanicAPP")HOST = "localhost"PORT = 7777app.config.FALLBACK_ERROR_FORMAT = 'json'app.config.ACCESS_LOG = Trueasync def get_datetime(): return datetime.now().strftime("%Y-%m-%d %H:%M:%S")@app.route('/getdatetime')async def getdatetime(request): return json({"now": await get_datetime(), 'server_name': request.server_name, 'path': request.path})if __name__ == "__main__": app.run(host=HOST, port=PORT, debug=False, auto_reload=True, workers=multiprocessing.cpu_count() // 5)于生产环境启动运行:
打开网址
http://127.0.0.0:7777/docs/redoc
你将看见默认的 Redoc 风格的 API文档:
而 Tortoise ORM 是一个使用 asyncio 语法的 ORM,其灵感来源于 Django 自带的 ORM,所以它的语法和 Django ORM 极其相似
那么 Sanic 为啥要选择 Tortoise ORM 作为最佳搭档呢?
首先 Tortoise 本身就是使用 asyncio 语法的,与 Sanic 一样,其次它的 API 设计既干净又实用,性能上也比其他 Python ORM 要好:
安装 Tortoise ORM:
pip install tortoise-orm
定义一个博客模型:
from tortoise.models import Modelfrom tortoise import fieldsfrom datetime import dateclass Blog(Model): headline = fields.CharField(max_length=100) author = fields.CharField(max_length=20, default='makerchen66') pub_date = fields.DateField(default=date.today()) content = fields.TextField() def __str__(self): return self.headline class Meta: db_table = 'blog'
然后需要初始化模型和数据库:
from tortoise import Tortoise, run_asyncasync def init(): await Tortoise.init( db_url='sqlite://db.sqlite3', modules={'models': ['app.models']} ) # Generate the schema await Tortoise.generate_schemas()run_async(init()最后就可使用模型:
# Create instance by saveblog = Blog(headline='震惊!某知名女明星竟然。。。', content='在一个风雨交加的夜晚,某国知名功夫宗师--马宝锅,正在练功室内锻炼绝技。。。', author='makerchen66', pub_date=date(2006, 3, 3))await blog.save()# Or by .create()await Blog.create(headline='震惊!某知名女明星竟然。。。', content='在一个风雨交加的夜晚,某国知名功夫宗师--马宝锅,正在练功室内锻炼绝技。。。', author='makerchen66', pub_date=date(2006, 3, 3))# Now search for a recordqueryResult = await Blog.filter(headline__contains='女明星').first()print(queryResult.author)
更多 Tortoise ORM 使用教程可参考官网:
https://tortoise.github.io/#tutorial
Tortoise ORM Github 项目地址:
https://github.com/tortoise/tortoise-orm
接下来将爬虫项目和 Sanic 结合起来
三、爬虫 API 实战项目
接下来创建一个爬虫 API 实战项目,并且使路由模块、爬虫模块、视图模块、项目启动文件、配置文件独立
四、服务器部署及接口性能测试
使用 screen 工具挂载 Sanic 项目:
screen -S sanic_api
查看是否创建成功:
screen -ls
进入项目:
screen -d -r sanic_api
进入项目所在根目录,创建虚拟环境:
virtualenv venv --python=python3.9.17
进入虚拟环境:
source venv/bin/activate
安装项目所需的 Python 环境:
pip install -r requirements.txt -i https://pypi.doubanio.com/simple
最后启动项目:
python server.py
启动成功:
删除该 screen 项目:
screen -S -X sanic_screen_id quit
如果对性能有更进一步的要求,可以和 Nginx Docker 等结合部署。
五、作者Info
Author:小鸿的摸鱼日常,Goal:让编程更有趣!
专注于 Web开发、爬虫,游戏开发,数据分析、自然语言处理,AI等,期待你的关注,让我们一起成长、一起Coding!
版权说明:本文禁止抄袭、转载,侵权必究!
下一篇:公司的服务器怎么搭建?