使用 HTTP/2#

HTTP/2 是用于传输网页数据的超文本传输协议的第二个主要版本。

注意

并非所有 ASGI 服务器都支持 HTTP/2。推荐的 ASGI 服务器 Hypercorn 支持 HTTP/2。

要在开发中使用 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 连接一样)。Hypercorn 是推荐的 ASGI 服务器,它支持此扩展。

在测试服务器推送时,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 客户端。最好的选择是使用浏览器并检查网络连接(打开协议信息)。否则可以使用 curl,如果安装了 HTTP/2 支持,installed,如下所示:

$ curl --http2 ...

如果您希望通过 Python 进行 HTTP/2 通信,httpx 是最佳选择。