自定义协议

注解

这是高级用法,大多数读者不需要这种功能。

您可以通过指定一个自定义协议来更改SANIC协议的行为,该协议应该是 asyncio.protocol . 然后可以将此协议作为关键字参数传递 protocolsanic.run 方法。

自定义协议类的构造函数从SANIC接收以下关键字参数。

  • loop 一个 asyncio -兼容的事件循环。

  • connections 答: set 存储协议对象。当Sanic收到 SIGINTSIGTERM 它执行 protocol.close_if_idle 用于存储在此集中的所有协议对象。

  • signal 答: sanic.server.Signal 对象与 stopped 属性。当Sanic收到 SIGINTSIGTERMsignal.stopped 被指派 True .

  • request_handler :一个需要 sanic.request.Request 对象与A response 作为参数回调。

  • 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)