1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【Web开发】Python实现Web服务器(Sanic)

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

时间:2024-05-03 13:25:21

相关推荐

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

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

🎈【Web开发】Python实现Web服务器(Flask快速入门)🎈🎈【Web开发】Python实现Web服务器(Flask案例测试)🎈🎈【Web开发】Python实现Web服务器(Flask部署上线)🎈🎈【Web开发】Python实现Web服务器(Tornado入门)🎈🎈【Web开发】Python实现Web服务器(Tornado+flask+nginx)🎈🎈【Web开发】Python实现Web服务器(FastAPI)🎈🎈【Web开发】Python实现Web服务器(Bottle)🎈🎈【Web开发】Python实现Web服务器(Django)🎈🎈【Web开发】Python实现Web服务器(web2py)🎈🎈【Web开发】Python实现Web服务器(Sanic)🎈

文章目录

1、简介2、安装2.1 安装sanic2.2 安装sanic拓展2.3 安装ubuntu3、示例测试3.1 Hello, world3.2 配置(Configuration)3.3 响应函数(Handlers)3.4 请求(Request)3.5 响应(Response)3.6 路由(Routing)3.7 监听器(Listeners)3.8 中间件(Middleware)3.9 标头(Headers)3.10 Cookies3.11 后台任务(Background tasks)结语

1、简介

https://sanic.dev/zh/

/sanic-org/sanic

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

目标(Goal)

提供一种简单且快速,集创建和启动于一体的方法,来实现一个易于修改和拓展的 HTTP 服务。

特征(Features)

内置极速 web server

生产准备就绪

极高的拓展性

支持 ASGI

简单直观的 API 设计

社区保障

2、安装

2.1 安装sanic

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

pip install sanic

2.2 安装sanic拓展

Sanic 致力于构建一个简洁且没有任何偏见的特征表。该项目不想要求您以某种方式构建应用程序,并试图避免指定特定的开发模式。有许多由社区构建和维护的第三方插件,用于添加不符合核心库要求的附加功能。

但是,为了 帮助 API 开发者 ,Sanic 组织维护了一个名为 Sanic Extensions 的项目来提供各种易用的功能,包括:

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

pip install sanic sanic-ext

2.3 安装ubuntu

安装python

sudo apt-get updatesudo apt-get install software-properties-commonsudo add-apt-repository ppa:jonathonf/python-3.8sudo apt-get updatesudo apt-get install python3.8

更改python快捷方式

查看python版本

pip --version

查看python命令指代的版本

cd /usr/binls -l | grep python

删除python2.7快捷方式

sudo rm python

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

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

创建python虚拟环境

安装Virtualenv

sudo pip install virtualenv

创建项目,修改权限

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

创建虚拟环境venv

mkvirtualenv -p python3 venvvirtualenv venv

进入虚拟环境

source venv/bin/activate

安装必要的库

pip install -r requirements.txt

运行测试程序:

sanic test_sanic.app

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

python -m ensurepippython -m pip install --upgrade pip

sudo apt install --fix-missing python3-pip

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.pypython3 get-pip.py --force-reinstall

pip3 install sanicorpip install sanic

3、示例测试

3.1 Hello, world

test_sanic.py

from sanic import Sanicfrom sanic.response import textapp = Sanic("MyHelloWorldApp")@app.get("/")async def hello_world(request):return text("Hello, world. 爱看书的小沐!")

命令行执行命令:

sanic test_sanic.app

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

#!/usr/bin/env pythonfrom sanic import Sanicfrom sanic.response import textapp = Sanic("MyHelloWorldApp")@app.get("/")async def hello_world(request):return text("Hello, world. 爱看书的小沐!")## python -m sanic server.app --host=0.0.0.0 --port=1337 --workers=4## sanic server:app --host=0.0.0.0 --port=1337 --fast## sanic ./path/to/dir --simple## sanic ./path/to/dir --simple --reload --reload-dir=./path/to/dirapp.run(host='0.0.0.0', port=1337, access_log=False)# app.run(host='0.0.0.0', port=1337, workers=4)# app.run(host='0.0.0.0', port=1337, fast=True)

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 Configclass 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 实例包含许多有关其参数的有用信息。

>>> 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 种常用的返回类型,您可以通过以下方式中的任意一种快速生成返回对象。

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

3.6 路由(Routing)

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

3.7 监听器(Listeners)

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

@app.reload_process_startasync def reload_start(*_):print(">>>>>> reload_start <<<<<<")@app.main_process_startasync def main_start(*_):print(">>>>>> main_start <<<<<<")

3.8 中间件(Middleware)

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

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

3.9 标头(Headers)

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

app.config.SERVER_NAME = ""@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 可以通过和字典类型一样的操作方法来进行设置,而且它可以使用以下参数:

@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-"response.cookies["test"]["httponly"] = Truereturn 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) # Note: we are passing the callable and not coroutine object `slow_work(...)`app.run(...)

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭

如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???

如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)

感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。