【Web开发】Python实现Web服务器(Sanic)

🍺基于Python的Web服务器系列相关文章编写如下🍺:

  1. 🎈【Web开发】Python实现Web服务器(Flask快速入门)🎈
  2. 🎈【Web开发】Python实现Web服务器(Flask案例测试)🎈
  3. 🎈【Web开发】Python实现Web服务器(Flask部署上线)🎈
  4. 🎈【Web开发】Python实现Web服务器(Tornado入门)🎈
  5. 🎈【Web开发】Python实现Web服务器(Tornado+flask+nginx)🎈
  6. 🎈【Web开发】Python实现Web服务器(FastAPI)🎈
  7. 🎈【Web开发】Python实现Web服务器(Bottle)🎈
  8. 🎈【Web开发】Python实现Web服务器(Django)🎈
  9. 🎈【Web开发】Python实现Web服务器(web2py)🎈
  10. 🎈【Web开发】Python实现Web服务器(Sanic)🎈

文章目录

1、简介

https://sanic.dev/zh/
https://github.com/sanic-org/sanic

Sanic 是 Python3.7+ Web 服务器和 Web 框架,旨在提高性能。它允许使用 Python3.5 中添加的 async/await 语法,这使得您的代码有效的避免阻塞从而达到提升响应速度的目的。

【Web开发】Python实现Web服务器(Sanic)
  • 目标(Goal)
    提供一种简单且快速,集创建和启动于一体的方法,来实现一个易于修改和拓展的 HTTP 服务。
  • 特征(Features)
    内置极速 web server
    生产准备就绪
    极高的拓展性
    支持 ASGI
    简单直观的 API 设计
    社区保障

【Web开发】Python实现Web服务器(Sanic)

; 2、安装

2.1 安装sanic

在我们开始之前,请确保您使用的是 Python3.7 或更高版本。目前已知可以使用的 Python 版本包括:3.7,3.8 和 3.9。

pip install sanic

【Web开发】Python实现Web服务器(Sanic)

2.2 安装sanic拓展

Sanic 致力于构建一个简洁且没有任何偏见的特征表。该项目不想要求您以某种方式构建应用程序,并试图避免指定特定的开发模式。有许多由社区构建和维护的第三方插件,用于添加不符合核心库要求的附加功能。
但是,为了 帮助 API 开发者 ,Sanic 组织维护了一个名为 Sanic Extensions 的项目来提供各种易用的功能,包括:

  • OpenAPI 使用 Redoc 和/或 Swagger 的文档
  • CORS 保护
  • 依赖注入 路由处理程序
  • Request 参数 检查
  • 自动创建 HEAD, OPTIONS, 和 TRACE 响应函数
  • 响应序列化
pip install sanic sanic-ext

【Web开发】Python实现Web服务器(Sanic)

2.3 安装ubuntu

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:jonathonf/python-3.8
sudo apt-get update
sudo apt-get install python3.8
  • 更改python快捷方式
    查看python版本
pip --version

查看python命令指代的版本

cd  /usr/bin
ls -l  | grep python

删除python2.7快捷方式

sudo rm python

创建python3.8快捷方式,安装pip3

sudo ln -s  python3.6m python
sudo apt-get install python-pip

创建python虚拟环境
安装Virtualenv

sudo pip install virtualenv

创建项目,修改权限

sudo mkdir /root/flowerdance
sudo chmod 777 /root/flowerdance

创建虚拟环境venv

mkvirtualenv -p python3 venv
virtualenv venv

进入虚拟环境

source venv/bin/activate

安装必要的库

pip install -r requirements.txt

运行测试程序:

sanic test_sanic.app

【Web开发】Python实现Web服务器(Sanic)

有可能在用pip下载的时候出现错误: ModuleNotFoundError: No module named ‘pip._internal’,有可能是与旧版冲突,所以可能事先卸载旧版。

python -m ensurepip
python -m pip install --upgrade pip
sudo apt install --fix-missing python3-pip
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py --force-reinstall

【Web开发】Python实现Web服务器(Sanic)
 pip3 install sanic
 or
 pip install sanic

【Web开发】Python实现Web服务器(Sanic)

3、示例测试

【Web开发】Python实现Web服务器(Sanic)

; 3.1 Hello, world

  • test_sanic.py
from sanic import Sanic
from sanic.response import text

app = Sanic("MyHelloWorldApp")

@app.get("/")
async def hello_world(request):
    return text("Hello, world. 爱看书的小沐!")
  • 命令行执行命令:
sanic test_sanic.app

【Web开发】Python实现Web服务器(Sanic)
这是 另一个 重要的区别。其他框架带有一个内置的开发服务器,并明确表示它只用于开发。而 Sanic 的情况恰好相反。可以用于生产环境的服务器已经准备就绪。

【Web开发】Python实现Web服务器(Sanic)

from sanic import Sanic
from sanic.response import text

app = Sanic("MyHelloWorldApp")

@app.get("/")
async def hello_world(request):
    return text("Hello, world. 爱看书的小沐!")

app.run(host='0.0.0.0', port=1337, access_log=False)

3.2 配置(Configuration)

Sanic 将配置保存在 Sanic 对象的 config 属性中。可以使用 属性操作 或 字典操作 的方式来修改配置。

app = Sanic('myapp')

app.config.DB_NAME = 'appdb'
app.config['DB_USER'] = 'appuser'

db_settings = {
    'DB_HOST': 'localhost',
    'DB_NAME': 'appdb',
    'DB_USER': 'appuser'
}
app.config.update(db_settings)

如果您使用了自定义配置对象类,强烈建议 您将自定义类继承 Sanic 的 Config 类,以保持与父类行为一致。

from sanic.config import Config

class MyConfig(Config):
    FOO = "bar"

app = Sanic(..., config=MyConfig())

3.3 响应函数(Handlers)

第二个重要的组件就是响应函数(Handlers),也就是我们通常所说的视图(views)。

在 Sanic 中,响应函数可以是任何一个可调用程序,它至少以一个 request 实例作为参数,并返回一个 HTTPResponse 实例或一个执行其他操作的协同程序作为响应。

def i_am_a_handler(request):
    return HTTPResponse()

async def i_am_ALSO_a_handler(request):
    return HTTPResponse()

from sanic.response import text

@app.get("/foo")
async def foo_handler(request):
    return text("I said foo!")

@app.get("/sync")
def sync_handler(request):
    time.sleep(0.1)
    return text("Done.")

@app.get("/async")
async def async_handler(request):
    await asyncio.sleep(0.1)
    return text("Done.")

3.4 请求(Request)

Request 实例包含许多有关其参数的有用信息。

【Web开发】Python实现Web服务器(Sanic)
>>> print(request.args)
{'key1': ['val1', 'val3'], 'key2': ['val2']}

>>> print(request.args.get("key1"))
val1

>>> print(request.args.getlist("key1"))
['val1', 'val3']

>>> print(request.query_args)
[('key1', 'val1'), ('key2', 'val2'), ('key1', 'val3')]

>>> print(request.query_string)
key1=val1&key2=val2&key1=val3

3.5 响应(Response)

所有的 响应函数 都必须返回一个 response 对象,中间件 可以自由选择是否返回 response 对象。
Sanic 内置了 9 种常用的返回类型,您可以通过以下方式中的任意一种快速生成返回对象。

【Web开发】Python实现Web服务器(Sanic)
from sanic.response import text

@app.route("/")
async def handler(request):
    return text("Hi 😎")

3.6 路由(Routing)

每一个标准的 HTTP 请求方式都对应封装了一个简单易用的装饰器:

【Web开发】Python实现Web服务器(Sanic)

; 3.7 监听器(Listeners)

在 Sanic 应用程序的生命周期中 8 个切入点,在这些关键节点上设置监听器可以让您可以完成一些注入操作。但是这里并不包括信号,信号允许进一步的注入定制。

【Web开发】Python实现Web服务器(Sanic)
@app.reload_process_start
async def reload_start(*_):
    print(">>>>>> reload_start <<<<<)

@app.main_process_start
async def main_start(*_):
    print(">>>>>> main_start <<<<<)

3.8 中间件(Middleware)

监听器允许您将功能挂载到工作进程的生命周期,而中间件允许您将功能挂载到 HTTP 流的生命周期。

您可以在执行响应函数之前或者响应函数之后执行中间件。

【Web开发】Python实现Web服务器(Sanic)

3.9 标头(Headers)

请求头和响应头仅在对应的 Request 对象和 HTTPResponse 对象中起作用。它们使用 multidict 包(opens new window) 进行构建,这意味着它们允许一个键名具有多个对应值。

app.config.SERVER_NAME = "https://example.com"

@app.route("/hosts", name="foo")
async def handler(request):
    return json(
        {
            "effective host": request.host,
            "host header": request.headers.get("host"),
            "forwarded host": request.forwarded.get("host"),
            "you are here": request.url_for("foo"),
        }
    )

3.10 Cookies

response 的 cookies 可以通过和字典类型一样的操作方法来进行设置,而且它可以使用以下参数:

【Web开发】Python实现Web服务器(Sanic)
@app.route("/cookie")
async def test(request):
    response = text("There's a cookie up in this response")
    response.cookies["test"] = "It worked!"
    response.cookies["test"]["domain"] = ".yummy-yummy-cookie.com"
    response.cookies["test"]["httponly"] = True
    return response

3.11 后台任务(Background tasks)

在异步 Python 里使用 任务(opens new window) 是非常简单方便的,Sanic 提供了一种简单的方法来将任务添加到当前运行的 loop 当中, 它有点类似于 asyncio.create_task。

async def slow_work(...):
   ...

app = Sanic(...)
app.add_task(slow_work)
app.run(...)

结语

&#x5982;&#x679C;&#x60A8;&#x89C9;&#x5F97;&#x8BE5;&#x65B9;&#x6CD5;&#x6216;&#x4EE3;&#x7801;&#x6709;&#x4E00;&#x70B9;&#x70B9;&#x7528;&#x5904;&#xFF0C;&#x53EF;&#x4EE5;&#x7ED9;&#x4F5C;&#x8005;&#x70B9;&#x4E2A;&#x8D5E;&#xFF0C;&#x6216;&#x6253;&#x8D4F;&#x676F;&#x5496;&#x5561;&#xFF1B;╮( ̄▽ ̄)╭
&#x5982;&#x679C;&#x60A8;&#x611F;&#x89C9;&#x65B9;&#x6CD5;&#x6216;&#x4EE3;&#x7801;&#x4E0D;&#x548B;&#x5730;//(ㄒoㄒ)// &#xFF0C;&#x5C31;&#x5728;&#x8BC4;&#x8BBA;&#x5904;&#x7559;&#x8A00;&#xFF0C;&#x4F5C;&#x8005;&#x7EE7;&#x7EED;&#x6539;&#x8FDB;&#xFF1B;o_O???
&#x5982;&#x679C;&#x60A8;&#x9700;&#x8981;&#x76F8;&#x5173;&#x529F;&#x80FD;&#x7684;&#x4EE3;&#x7801;&#x5B9A;&#x5236;&#x5316;&#x5F00;&#x53D1;&#xFF0C;&#x53EF;&#x4EE5;&#x7559;&#x8A00;&#x79C1;&#x4FE1;&#x4F5C;&#x8005;&#xFF1B;(✿◡‿◡)
&#x611F;&#x8C22;&#x5404;&#x4F4D;&#x5927;&#x4F6C;&#x7AE5;&#x978B;&#x4EEC;&#x7684;&#x652F;&#x6301;&#xFF01;( ´ ▽´ )ノ ( ´ ▽´)っ!!!

Original: https://blog.csdn.net/hhy321/article/details/127173940
Author: 爱看书的小沐
Title: 【Web开发】Python实现Web服务器(Sanic)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/744611/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Python数据分析之数据清洗及特征处理

    🚩 2.1 缺失值观察与处理 查看列数据 import numpy as np import pandas as pd df = pd.read_csv(‘./train.csv’…

    Python 2023年8月8日
    052
  • Python SQLite3 教程

    在本教程中,我们将使用 Python 以编程方式处理 SQLite3 数据库。 SQLite 通常是一种无服务器数据库,您可以在包括 Python 在内的几乎所有编程语言中使用它。…

    Python 2023年8月1日
    079
  • Python和Numpy的加权抛硬币游戏的概率

    使用Python和Numpy的加权抛硬币游戏的概率 本周的一个简短而有趣的游戏。 两个玩家正在玩一个游戏,他们从玩家1开始抛出一枚不一定公平的硬币。第一个抛出正面的人获胜。抛出的硬…

    Python 2023年8月24日
    059
  • 强化学习-学习笔记1 | 基础概念

    1. 基本概念 1.1 概率论的基础知识 a. 随机变量 概念:是一个未知的量,值是由随机事件结果来决定的。 * 使用小写 x 来表示随机变量 X 的 观测值,只是表示一个数,没有…

    Python 2023年10月29日
    039
  • 安装anaconda3并使用jupyter notebook

    一、安装与使用 下载地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.1.0-Windows…

    Python 2023年8月22日
    081
  • 第六章:django中的cookie与session

    系列文章目录 第一章 :Django安装与配置虚拟环境 第二章:django各模块的作用以及参数说明 第三章: Django的路由与视图 第四章:django请求 第五章:djan…

    Python 2023年8月4日
    026
  • python 对excel的函数操作(2)

    1、用pandas的二维数组做除法运算,替换inf,过滤inf等操作 import pandas as pd import numpy as np 用pandas科学数据库操作ex…

    Python 2023年8月6日
    041
  • ChatGPT在IDEA中使用

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年11月5日
    024
  • 想要做好代码质量,如何破局?

    作者:苗现方 想要做好代码质量,我们不得不提什么是代码质量?本文中讨论的代码质量一般是指代码的风格、重复率和复杂度等,代码是技术团队的价值产物,是宝贵的财富,同样代码质量的好坏可以…

    Python 2023年10月14日
    027
  • python+selenium+allure+pytest webUI自动化小白上路

    提示:python+selenium+allure+pytest webUI自动化文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、环境准备 二、问题…

    Python 2023年9月11日
    043
  • 从入门到精通,学Python一套就够了

    抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 Original: https://blo…

    Python 2023年9月18日
    051
  • SSTI模板注入讲解与真题实操

    0x00 SSTI 1.什么是SSTI注入?SSTI模板注入(Server-Side Template Injection),通过与服务端模板的 输入输出交互,在过滤不严格的情况下…

    Python 2023年8月10日
    049
  • python中的pygame使用_在pyg中使用pygame操纵杆

    我试图用pyglet编写一个简单的游戏,但是使用pygame作为gamepad的输入。以下代码成功地将axis值打印到命令行,但是除了导入pyglet之外,实际上并没有显示pygl…

    Python 2023年9月24日
    053
  • Django-合并migrations

    一、背景 在开发一个迭代时,产生了很多migrations文件,而且这些migrations文件都是一个model表改来改去产生的,有必要将这个迭代的migrations文件在提测…

    Python 2023年8月4日
    060
  • LVS 引入keepalived自动切换机制

    keepalived简介 Keepalived是一款由C编写的软件,一般解决负载均衡器的高可用性问题,提供了负载均衡、健康检查和高可用的功能,高可用功能是由VRRP协议来实现的。k…

    Python 2023年11月7日
    033
  • Django的请求和响应

    POST 处理 POST请求动作一般用于向服务器提交大量/隐私数据 客户端通过表单等POST请求将数据传递给服务器端;如: <form method=’post’ actio…

    Python 2023年8月5日
    042
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球