1,Custom Protocol:自定义协议

温馨提示:自定义协议是一个高级用法,大多数的读者不需要用到此功能

通过特殊的自定义协议,你可以改变sanic的协议,自定义协议需要继承子类asyncio.protocol,这个子类在sanic.run方法中传输关键字protocol协议

自定义协议的构造类从sanic中接收关键字参数.

  • loop: an asyncio-compatible event loop.(循环:异步兼容事件循环)
  • connections: a set to store protocol objects. When Sanic receives SIGINT or SIGTERM, it executes protocol.close_if_idle for all protocol objects stored in this set.(连接:一个存储协议对象的集合当接收到一个信号的时候,将会执行自定义的协议,close_if_idle会为所有的协议对象存储在这个集合中)
  • signal: a sanic.server.Signal object with the stopped attribute. When Sanic receives SIGINTor SIGTERMsignal.stopped is assigned True(信号:一个sanic服务器信号对象是用sanic停止的属性来控制的,当sanic接收到信号,stopped的属性就会变成Ture)
  • request_handler: a coroutine that takes a sanic.request.Request object and a response callback as arguments(处理请求:将sanic的请求对象和响应回调作为参数的协程)
  • error_handler: a sanic.exceptions.Handler which 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(网络套接字)的更多相关文章

  1. sanic官方文档解析之websocket(网络套接字)和handle decorators(处理程序装饰器)

    1,websocket(网络套接字) 在websocket上Sanic提供了一种简单使用的抽象化,来设置websocket(网络套接字) from sanic import Sanic from sa ...

  2. sanic官方文档解析之Deploying(部署)和Extension(扩展)

    1,Deploying(部署) 通过内置的websocket可以很简单的部署sanic项目,之后通过实例sanic.Sanic,我们可以运行run这个方法通过接下来的关键字参数 host (defau ...

  3. sanic官方文档解析之Example(一)

    1,示例 这部的文档是简单的示例集合,它能够帮助你快速的启动应用大部分的应用,这些应用大多事分类的,并且提供给ini工作的连接代码: 1.1,基础示例 这部分示例集成了提供简单sanic简单的代码 单 ...

  4. sanic官方文档解析之路由

    1,路由,路由相当于一个网址的地址,来确定网址的位置和唯一性 当http://server.url/被允许访问服务器,当最后的"/"通过路由匹配到了业务逻辑处理的函数,将会返回一个 ...

  5. sanic官方文档解析之logging和request Data

    1,sanic的logging: Sanic允许有做不同类型的日志(通过的日志,错误的日志),在基于Python3的日志API接口请求,你必须具备基本的Python3的日志知识,在你如果想创建一个新的 ...

  6. sanic官方文档解析之下载和Configuration

    1,sanic框架是做什么的? sanic的官方网址:https://sanic.readthedocs.io/en/latest/ sanic框架是一个类似于flask框架的在Python3.5以上 ...

  7. sanic官方文档解析之Example(二)

    1,通过docker部署sanic项目 通过Docker和Docker Compose部署SANIC应用程序是一项很容易实现的任务,下面的示例提供了示例simple_server.py的部署 FROM ...

  8. sanic官方文档解析之ssl,debug mode模式和test(测试)

    1,ssl 示例: 可选择的SSLContent from sanic import Sanic import ssl context = ssl.create_default_context(pur ...

  9. sanic官方文档解析之streaming(流动,滚动)和class_based_views(CBV的写法)

    1,streaming(流媒体) 1.1请求流媒体 Sanic允许你通过流媒体携带请求数据,如下,当请求结束await request.stream.read()就会返回None,仅仅只有post请求 ...

随机推荐

  1. 【Ts 3】Nginx的Http(图片)服务器配置+ftp上传使用说明

    在前两篇博客中提到了搭建Nginx和Ftp服务器,在本篇博客,主要是介绍Nginx的配置文件的使用,怎样修改配置文件使其成为一个图片服务器. 一.Nginx图片服务器配置 <span style ...

  2. JSON.parse与eval区别

    两种方式都可以解析json字符串,不过有时候JSON.parse解析会失败,失败原因有多种,下面会指出一种. JSON.parse()解析json格式的数据,会对要解析的字符串进行格式检查,如果格式不 ...

  3. iOS学习笔记04-视图切换

    一.视图切换 UITabBarController (分页控制器) - 平行管理视图 UINavigationController (导航控制器) - 压栈出栈管理视图 模态窗口 二.UITabBar ...

  4. 刷题总结——鸭舌(ssoi)

    题目: 题目背景 CF 77C 题目描述 小美喜欢吃鸭舌.有一个 n 个点的树,每个节点 i ,第 i 个点上有 ai 个鸭舌.小美一开始处于 x 号点.每次小美可以选择一个与现在的点有边的点而且那个 ...

  5. P1582 倒水 (二进制)

    题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒 ...

  6. java中执行JS脚本

    package 测试包; import javax.script.*; public class SSSSSSSSS { public SSSSSSSSS() { // TODO Auto-gener ...

  7. android studio AndroidManifest

    一.目录结构 1. AndroidManifest.xml 它是一个清单文件,提供应用的基本信息 <?xml version="1.0" encoding="utf ...

  8. Codeforces 655E Beautiful Subarrays【01trie树】

    题目链接: http://codeforces.com/contest/665/problem/E 题意: 求异或值大于给定K的区间个数. 分析: 首先我们可以得到区间前缀的异或值. 这样我们将这个前 ...

  9. P2136 拉近距离(spfa判负环)

    洛谷—— P2136 拉近距离 题目背景 我是源点,你是终点.我们之间有负权环. ——小明 题目描述 在小明和小红的生活中,有N个关键的节点.有M个事件,记为一个三元组(Si,Ti,Wi),表示从节点 ...

  10. Codeforces 961 E Tufurama

    Discription One day Polycarp decided to rewatch his absolute favourite episode of well-known TV seri ...