HTTP/2 の使用#

HTTP/2 は、ウェブデータを転送するために使用されるハイパーテキスト転送プロトコルの第二主要バージョンです。

注記

すべての ASGI サーバーが HTTP/2 をサポートしているわけではありません。推奨される ASGI サーバーである Hypercorn はサポートしています。

開発で HTTP/2 を使用するには、いくつかの SSL 証明書を作成し、SSL で Quart を実行する必要があります。

サーバープッシュまたはプッシュプロミス#

HTTP/2 では、サーバーはクライアントに追加のレスポンスを事前にプッシュすることを選択できます。これはサーバープッシュと呼ばれ、レスポンス自体はプッシュプロミスと呼ばれます。サーバープッシュは、サーバーがクライアントがリクエストを開始する可能性が高い(たとえば、HTML レスポンスで参照される CSS や JS など)ことを知っている場合に非常に役立ちます。

注記

ブラウザはサーバープッシュのサポートを廃止しつつあり、使用は推奨されません。このセクションは参考のために残されています。

Quart では、make_push_promise() 関数を使用して、リクエスト中にサーバープッシュを開始できます。たとえば、

async def index():
    await make_push_promise(url_for('static', filename='css/minimal.css'))
    return await render_template('index.html')

プッシュプロミスには、プッシュプロミスをトリガーするリクエストに存在するヘッダー値が含まれます(コピーされます)。これらは、リクエストが行われた場合と同様にプッシュプロミスにも応答するようにするためです。Accept ヘッダーが良い例です。コピーされるヘッダーの完全なセットは、リクエストモジュール内の SERVER_PUSH_HEADERS_TO_COPY です。

注記

この機能は、HTTP/2 Server Push 拡張機能を実装する ASGI サーバーでのみ使用できます。サーバーがこの拡張機能をサポートしていない場合、Quart はプッシュプロミスを無視します(HTTP/1 接続の場合と同じ)。推奨される ASGI サーバーである Hypercorn はこの拡張機能をサポートしています。

サーバープッシュをテストする場合、QuartClientpush_promises リストには、パスとヘッダーのタプルとしてすべてのプッシュプロミスが含まれます。たとえば、

async def test_push_promise():
    test_client = app.test_client()
    await test_client.get("/push")
    assert test_client.push_promises[0] == ("/", {})

HTTP/2 クライアント#

執筆時点では、HTTP/2 クライアントはそれほど多くありません。最適な方法は、ブラウザを使用してネットワーク接続を検査することです(プロトコル情報を有効にする)。それ以外の場合は、HTTP/2 のサポートがインストールされていれば、curl を使用できます。

$ curl --http2 ...

Python で HTTP/2 を介して通信する場合は、httpx が最適です。