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请求 ...
随机推荐
- 九度oj 题目1114:神奇的口袋
题目描述: 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an.John可以从这些物品中 ...
- POJ 2643 Election
Election Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3558 Accepted: 1692 Descript ...
- tomcat的安装和优化
tomcat的安装 jdk版本安装 #!/bin/bash # desc: jdk安装脚本1. 1.7 1.8 download_url='http://**************' jdk_env ...
- app审核相关
app加急审核通道:https://developer.apple.com/contact/app-store/?topic=expedite
- BZOJ 2463: [中山市选2009]谁能赢呢?【博弈】
这题不科学~~本以为鬼谷子的钱袋是能在BZOJ写的最短的程序了,这题还要短…..好吧,思考难度神马的还是有点的(至少对我这种蒟蒻来说).很明显这是道博弈论的题目,在纸上画出了n=1~4的博弈树,发现b ...
- JS控制背景音乐 没有界面
建立一个HTML5页面,放置<audio>标签,设置音频文件源,设置循环播放.准备两张图片,分别表示开启和暂停背景音乐两种状态,可以点击. <audio id="music ...
- 洛谷 [P2594] 染色游戏
博弈论+SG函数的应用 这是一个二维翻硬币问题 一维翻硬币问题有一个结论: 局面的SG值等于局面中所有反面朝上的硬币单独存在时的SG值的异或和 这个结论同样适用于二维的翻硬币问题 证明可以用数学归纳法 ...
- MongoDB_java连接MongoDB
java程序连接单机版的mongodb: 参考:http://www.runoob.com/mongodb/mongodb-java.html https://www.yiibai.com/mongo ...
- elasticsearch入门使用(一)es 6.2.2安装,centos 7
elasticsearch(一般叫es)是基于Lucene的搜索服务器,提供http协议接口使用json格式数据,也提供相应的客户端,更详细的信息[优点&场景]请百度百科, 以下官网截图,官网 ...
- 用“道”的思想解决费用流问题---取/不取皆是取 (有下界->有上界) / ACdreamoj 1171
题意: 给一个矩阵,给出约束:i(0<i<n)行至少去ai个数,j行至少取bi个数,要求取的数值之和最小. 开始一见,就直接建了二分图,但是,发现这是有下界无上界最小费用流问题,肿么办.. ...