自定义协议
注解
这是高级用法,大多数读者不需要这种功能。
您可以通过指定一个自定义协议来更改SANIC协议的行为,该协议应该是 asyncio.protocol . 然后可以将此协议作为关键字参数传递 protocol
到 sanic.run
方法。
自定义协议类的构造函数从SANIC接收以下关键字参数。
loop
一个asyncio
-兼容的事件循环。connections
答:set
存储协议对象。当Sanic收到SIGINT
或SIGTERM
它执行protocol.close_if_idle
用于存储在此集中的所有协议对象。signal
答:sanic.server.Signal
对象与stopped
属性。当Sanic收到SIGINT
或SIGTERM
,signal.stopped
被指派True
.request_handler
:一个需要sanic.request.Request
对象与Aresponse
作为参数回调。error_handler
答:sanic.exceptions.Handler
在引发异常时调用。request_timeout
:请求超时前的秒数。request_max_size
:指定请求最大大小的整数,以字节为单位。
例子
如果处理程序函数不返回 HTTPResponse
对象。
通过覆盖 write_response
协议方法,如果处理程序返回一个字符串,它将转换为 HTTPResponse object
.
from sanic import Sanic
from sanic.server import HttpProtocol
from sanic.response import text
app = Sanic(__name__)
class CustomHttpProtocol(HttpProtocol):
def __init__(self, *, loop, request_handler, error_handler,
signal, connections, request_timeout, request_max_size):
super().__init__(
loop=loop, request_handler=request_handler,
error_handler=error_handler, signal=signal,
connections=connections, request_timeout=request_timeout,
request_max_size=request_max_size)
def write_response(self, response):
if isinstance(response, str):
response = text(response)
self.transport.write(
response.output(self.request.version)
)
self.transport.close()
@app.route('/')
async def string(request):
return 'string'
@app.route('/1')
async def response(request):
return text('response')
app.run(host='0.0.0.0', port=8000, protocol=CustomHttpProtocol)