Add document for custom protocol
This commit is contained in:
parent
39b279f0f2
commit
83e9d08853
|
@ -59,6 +59,7 @@ if __name__ == "__main__":
|
||||||
* [Class Based Views](docs/class_based_views.md)
|
* [Class Based Views](docs/class_based_views.md)
|
||||||
* [Cookies](docs/cookies.md)
|
* [Cookies](docs/cookies.md)
|
||||||
* [Static Files](docs/static_files.md)
|
* [Static Files](docs/static_files.md)
|
||||||
|
* [Custom Protocol](docs/custom_protocol.md)
|
||||||
* [Deploying](docs/deploying.md)
|
* [Deploying](docs/deploying.md)
|
||||||
* [Contributing](docs/contributing.md)
|
* [Contributing](docs/contributing.md)
|
||||||
* [License](LICENSE)
|
* [License](LICENSE)
|
||||||
|
|
68
docs/custom_protocol.md
Normal file
68
docs/custom_protocol.md
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
# Custom Protocol
|
||||||
|
|
||||||
|
You can change the behavior of protocol by using custom protocol.
|
||||||
|
If you want to use custom protocol, you should put subclass of [protocol class](https://docs.python.org/3/library/asyncio-protocol.html#protocol-classes) in the protocol keyword argument of `sanic.run()`. The constructor of custom protocol class gets following keyword arguments from Sanic.
|
||||||
|
|
||||||
|
* loop
|
||||||
|
`loop` is an asyncio compatible event loop.
|
||||||
|
|
||||||
|
* connections
|
||||||
|
`connections` is a `set object` to store protocol objects.
|
||||||
|
When Sanic receives `SIGINT` or `SIGTERM`, Sanic executes `protocol.close_if_idle()` for a `protocol objects` stored in connections.
|
||||||
|
|
||||||
|
* signal
|
||||||
|
`signal` is a `sanic.server.Signal object` with `stopped attribute`.
|
||||||
|
When Sanic receives `SIGINT` or `SIGTERM`, `signal.stopped` becomes `True`.
|
||||||
|
|
||||||
|
* request_handler
|
||||||
|
`request_handler` is a coroutine that takes a `sanic.request.Request` object and a `response callback` as arguments.
|
||||||
|
|
||||||
|
* error_handler
|
||||||
|
`error_handler` is a `sanic.exceptions.Handler` object.
|
||||||
|
|
||||||
|
* request_timeout
|
||||||
|
`request_timeout` is seconds for timeout.
|
||||||
|
|
||||||
|
* request_max_size
|
||||||
|
`request_max_size` is bytes of max request size.
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```python
|
||||||
|
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)
|
||||||
|
```
|
|
@ -1,28 +0,0 @@
|
||||||
from sanic import Sanic
|
|
||||||
from sanic.server import HttpProtocol
|
|
||||||
from sanic.response import text
|
|
||||||
|
|
||||||
app = Sanic(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class CustomHttpProtocol(HttpProtocol):
|
|
||||||
|
|
||||||
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)
|
|
|
@ -251,7 +251,7 @@ class Sanic:
|
||||||
:param workers: Number of processes
|
:param workers: Number of processes
|
||||||
received before it is respected
|
received before it is respected
|
||||||
:param loop: asyncio compatible event loop
|
:param loop: asyncio compatible event loop
|
||||||
:param protocol: Subclass of asyncio.Protocol
|
:param protocol: Subclass of asyncio protocol class
|
||||||
:return: Nothing
|
:return: Nothing
|
||||||
"""
|
"""
|
||||||
self.error_handler.debug = True
|
self.error_handler.debug = True
|
||||||
|
|
|
@ -245,7 +245,7 @@ def serve(host, port, request_handler, error_handler, before_start=None,
|
||||||
:param request_max_size: size in bytes, `None` for no limit
|
:param request_max_size: size in bytes, `None` for no limit
|
||||||
:param reuse_port: `True` for multiple workers
|
:param reuse_port: `True` for multiple workers
|
||||||
:param loop: asyncio compatible event loop
|
:param loop: asyncio compatible event loop
|
||||||
:param protocol: Subclass of asyncio.Protocol
|
:param protocol: Subclass of asyncio protocol class
|
||||||
:return: Nothing
|
:return: Nothing
|
||||||
"""
|
"""
|
||||||
loop = loop or async_loop.new_event_loop()
|
loop = loop or async_loop.new_event_loop()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user