sanicのソースコードリーディングメモ

sanicはasyncioベースの速さに注力しているウェブサーバーです。
Python3.5以上で動作します。
Github  

appでありSanicクラス *

@app.route(uri, methods=None) *

これをしているだけ
app.router.add(uri=uri, methods=methods, handler=handler)
handlerはcoroutineである必要がある

router.add()ではuriのparameterを取得する正規表現の生成が行われる *
uriによってrouteを格納する変数を振り分ける *

    route = Route(
        handler=handler, methods=methods, pattern=pattern,
        parameters=parameters)

    self.routes_all[uri] = route
    if properties['unhashable']:
        self.routes_always_check.append(route)
    # add_parameter(match)でuriにパラメータがある場合
    elif parameters:
        self.routes_dynamic[url_hash(uri)].append(route)
    else:
        self.routes_static[uri] = route


Routeはnamedtuple *

app.run() *

サーバーイベントリスナーの登録 *
ワーカーの起動(serve()) *

serve() *

async_loopはuvloopもしくはasyncio *
loopの生成 *
create_server()でしてcoroutineを生成 *
protocol_factoryはHttpProtocolクラスを返す関数
HttpProtocolはasyncio.Protocolのサブクラス
1秒間ごとにcurrent_timeを更新する *
server_coroutineの実行 *

request_handler *

request_handlerはapp.handle_request(self, request, response_callback)
handle_requestはミドルウェアとハンドラを実行したあとresponse_callbackを実行する
response_callbackはwrite_response
on_message_complete()で実行される *


HttpProtocol *

HttpProtocolはasyncio.Protocolのサブクラス
on_url, on_header, on_headers_complete, on_body, on_message_completeはhttptoolsインスタンスから呼ばれる
self.parser = httptools.HttpRequestParser(self) *

connection_timeout, connection_made, data_receivedはasyncio.Protocolのメソッド


httptools *

app.parserはhttptools.HttpRequestParser(self) *

HTTPResponse *

json(), text(), html()はHTTPResponse()のwrapper

Request *

Requestはdictのサブクラス

Router *