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のメソッド
-
connection_made(self, transport) *
Transport
self.transport = transport * -
connection_timeout(self) *
connection_madeしてからのタイムアウトの処理
ここで設定されている -
data_received(self, data) *
リクエストデータを受け取ってhttptools.HttpRequestParserを実行 -
write_response(self, response) *
responseはhandlerの戻り値 *
self.transport.write()でresponseの内容を書き込んでいる * -
on_url(self, url) *
urlをセット -
on_header(self, name, value) *
self.headersにnameとvalueを追加 -
on_headers_complete(self) *
self.requestにRequestインスタンスを代入 -
on_body(self, body) *
self.request.body = body -
on_message_complete(self) *
request_handlerを実行する
httptools *
app.parserはhttptools.HttpRequestParser(self) *
HTTPResponse *
json(), text(), html()はHTTPResponse()のwrapper
Request *
Requestはdictのサブクラス