sanic官方文档解析之Custom Protocols(自定义协议)和Socket(网络套接字)
1,Custom Protocol:自定义协议

温馨提示:自定义协议是一个高级用法,大多数的读者不需要用到此功能
通过特殊的自定义协议,你可以改变sanic的协议,自定义协议需要继承子类asyncio.protocol,这个子类在sanic.run方法中传输关键字protocol协议
自定义协议的构造类从sanic中接收关键字参数.
loop: anasyncio-compatible event loop.(循环:异步兼容事件循环)connections: asetto store protocol objects. When Sanic receivesSIGINTorSIGTERM, it executesprotocol.close_if_idlefor all protocol objects stored in this set.(连接:一个存储协议对象的集合当接收到一个信号的时候,将会执行自定义的协议,close_if_idle会为所有的协议对象存储在这个集合中)signal: asanic.server.Signalobject with thestoppedattribute. When Sanic receivesSIGINTorSIGTERM,signal.stoppedis assignedTrue(信号:一个sanic服务器信号对象是用sanic停止的属性来控制的,当sanic接收到信号,stopped的属性就会变成Ture)request_handler: a coroutine that takes asanic.request.Requestobject and aresponsecallback as arguments(处理请求:将sanic的请求对象和响应回调作为参数的协程)error_handler: asanic.exceptions.Handlerwhich is called when exceptions are raised.(错误处理程序:当异常被抛出的时候,调用sanic.exception.Handler)request_timeout: the number of seconds before a request times out(请求超时:在请求超时前会有一些秒数.)request_max_size: an integer specifying the maximum size of a request, in bytes.(最大请求的量:指定请求最大的整数,以字节为单位)
例子:

如果一个处理函数没有返回一个HTTPResponse对象,表名一个错误的发生在默认的谢一中.通过重写write
_response协议方法,如果处理程序返回一个字符串被转换成一个HTTPResponse响应对象
from sanic import Sanic
from sanic.server import HttpProtocol # 在sanic的服务中存在HTTP协议
from sanic.response import text # 实例化一个Sanic对象
app = Sanic(__name__) class CustomHttpProtocol(HttpProtocol): # 初始化方法
def __init__(
self,
*,
loop,
request_handdler,
error_handler,
signal,
connections,
request_timeout,
request_max_size,
):
# 执行父类的初始化方法
super().__init__(
loop=loop,
request_handler=request_handdler,
error_handler=error_handler,
signal=signal,
connections=connections,
request_timeout=request_timeout,
request_max_size=request_max_size
) # 返回响应的方法
def write_response(self, response):
# 如果存在response对象
if isinstance(response, str):
# 封装response响应对象
response = text(response)
self.transport.write(
# 封装请求的信息
response.output(self.request.version)
)
self.transport.close() @app.route("/")
async def string(request):
return "string" @app.route("/i")
async def response(request):
return text("response") app.run(host="0.0.0.0", port=8000, protocol=CustomHttpProtocol) # 启动服务的时候指定协议为自定义协议
2,Socket(网络套接字)

Sanic可以使用Python中的socket模块来容纳IPV4的socket
from sanic import Sanic
from sanic.response import json
import socket
# 实例化socket对象
sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
sock.bind(("::", 7777)) # 绑定一个元组
# 实例化一个sanic对象
app = Sanic() # 业务处理函数
@app.route("/")
async def test(request):
return json({"hello": "world"}) if __name__ == '__main__':
app.run(sock=sock) # 以网络套接字的形式开启服务
UNIX的例子如下:
import signal
import sys
import socket
import os
from sanic import Sanic
from sanic.response import json server_socket = "/tmp/sanic.sock"
# 实例化socket对象
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) # socket.UNIX这个参数不对,是不是官网错了
sock.bind(server_socket) # 绑定
# 实例化Sanic对象
app = Sanic() @app.route("/")
async def test(request):
return json({"hello": "world"}) def signal_handler(sig, frame):
print("Exiting")
os.unlink(server_socket)
sys.exit(0) if __name__ == '__main__':
app.run(sock=sock)
sanic官方文档解析之Custom Protocols(自定义协议)和Socket(网络套接字)的更多相关文章
- sanic官方文档解析之websocket(网络套接字)和handle decorators(处理程序装饰器)
1,websocket(网络套接字) 在websocket上Sanic提供了一种简单使用的抽象化,来设置websocket(网络套接字) from sanic import Sanic from sa ...
- sanic官方文档解析之Deploying(部署)和Extension(扩展)
1,Deploying(部署) 通过内置的websocket可以很简单的部署sanic项目,之后通过实例sanic.Sanic,我们可以运行run这个方法通过接下来的关键字参数 host (defau ...
- sanic官方文档解析之Example(一)
1,示例 这部的文档是简单的示例集合,它能够帮助你快速的启动应用大部分的应用,这些应用大多事分类的,并且提供给ini工作的连接代码: 1.1,基础示例 这部分示例集成了提供简单sanic简单的代码 单 ...
- sanic官方文档解析之路由
1,路由,路由相当于一个网址的地址,来确定网址的位置和唯一性 当http://server.url/被允许访问服务器,当最后的"/"通过路由匹配到了业务逻辑处理的函数,将会返回一个 ...
- sanic官方文档解析之logging和request Data
1,sanic的logging: Sanic允许有做不同类型的日志(通过的日志,错误的日志),在基于Python3的日志API接口请求,你必须具备基本的Python3的日志知识,在你如果想创建一个新的 ...
- sanic官方文档解析之下载和Configuration
1,sanic框架是做什么的? sanic的官方网址:https://sanic.readthedocs.io/en/latest/ sanic框架是一个类似于flask框架的在Python3.5以上 ...
- sanic官方文档解析之Example(二)
1,通过docker部署sanic项目 通过Docker和Docker Compose部署SANIC应用程序是一项很容易实现的任务,下面的示例提供了示例simple_server.py的部署 FROM ...
- sanic官方文档解析之ssl,debug mode模式和test(测试)
1,ssl 示例: 可选择的SSLContent from sanic import Sanic import ssl context = ssl.create_default_context(pur ...
- sanic官方文档解析之streaming(流动,滚动)和class_based_views(CBV的写法)
1,streaming(流媒体) 1.1请求流媒体 Sanic允许你通过流媒体携带请求数据,如下,当请求结束await request.stream.read()就会返回None,仅仅只有post请求 ...
随机推荐
- 【java基础 5】树形结构数据加载的思考
前面两篇文章,分别介绍了使用递归和非递归算法加载树形结构数据的方式,本篇文章,则是自己闲下来的时候,进行的一点小思考. 一.什么地方会用到树形结构 刚开始一看到这种结构的时候,最先是想到了家谱.家谱就 ...
- SPOJ-COLONY - Linearian Colony!简单二分思想
COLONY - Linearian Colony 一道很水的题却坑我两天!在CF上做过类似的题,用递归可以找到答案,但感觉不会这么麻烦,于是看看有没有什么规律,对Y分奇偶貌似可以找到规律,但WA了三 ...
- jenkins+jacoco+ant+apache集成统计web端功能测试覆盖率
一.覆盖率定义 作为一个测试人员,保证产品的软件质量是其工作首要目标,为了这个目标,测试人员常常会通过很多手段或工具来加以保证,覆盖率就是其中一环比较重要的环节. 我们通常会将测试覆盖率分为两个部分, ...
- POJ——3984迷宫问题(BFS+回溯)
迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14568 Accepted: 8711 Description ...
- 【二叉搜索树】poj 1577 Falling Leaves
http://poj.org/problem?id=1577 [题意] 有一颗二叉搜索树,每次操作都把二叉搜索树的叶子从左到右揪掉(露出来的父节点就变成了新的叶子结点) 先给出了揪掉的叶子序列(多个字 ...
- Linux(11):期中架构(3)--- SSH远程管理服务 & ansible 批量管理服务
SSH远程管理服务 1. 远程管理服务知识介绍 # 1.1 SSH远程登录服务介绍说明 SSH是Secure Shell Protocol的简写,由 IETF 网络工作小组(Network Worki ...
- 频繁项挖掘算法Apriori和FGrowth
一:背景介绍 最近在公司用spark的平台做了一个购物车的推荐,用到的算法主要是FGrowth算法,它是Apriori算法的升级版,算法的主要目的是找出频繁进行一起购买的商品.本文主要介绍两个算法的背 ...
- msp430入门学习40
msp430的其他八 msp430入门学习
- msp430项目编程50
msp430综合项目---gsm无线采集传输平台系统50 1.电路工作原理 2.代码(显示部分) 3.代码(功能实现) 4.项目总结
- Can't connect to X11 window server using 'localhost:0.0' 的解决
Can't connect to X11 window server using 'localhost:0.0' 的解决 http://lufei-99999.blog.163.com/blog/st ...