ASGI とは

ASGIとはWSGIと呼ばれるPythonのWebサーバとWebアプリケーションが通信するためインタフェース定義の後継仕様となっており、WebSocketと非同期をサポートするように設計されているものです。
ASGI(Asynchronous Server Gateway Interface):非同期サーバーゲートウェイインターフェースです。

まずはWSGIとは以下のようになっています。
WSGIアプリケーションにはapplication関数を定義します。WSGIサーバからはenvironとstart_responseが渡ってくるのでenvironを用いてレスポンスのボディとなるバイトのリストを返します。
・受信したリクエストに関する情報を含む辞書(envrion)
・WSGIアプリケーションから呼び出されるコールバック関数(start_response)

def application(environ, start_response):
    start_response(
        "200 OK",
        [("Content-Type", "text/plain")]
    )
    return [b"Hello, World"]

ASGIインタフェースの仕様としてはASGIサーバから以下の3つの引数を受け取るapplication関数をASGIアプリケーションに定義します。
・受信したリクエストに関する情報を含む辞書(scope)
・ASGIサーバからのボディの情報を受け取る(receive)
・ASGIサーバへ応答の開始と応答の本体を送る(send)

async def application(scope, receive, send):
    await send({
        "type": "http.response.start",
        "status": 200,
        "headers": [
            [b"content-type", b"text/plain"],
        ]
    })
    
    await send({
        "type": "http.response.body",
        "body": b"Hello, World",
    })
    

# scopeの例
scope = {
    "type": "http",
    "method": "POST",
    "path": "/",
    "query_string": b"a=b",
}

# receiveの例
receive = {
    "type": "http.request.body",
    "body": b'{"example": "JSON data"}',
    "more_body": False,
}

この記事が気に入ったらサポートをしてみませんか?