使用 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 服务器,它支持此扩展。
在测试服务器推送时,QuartClient
的 push_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 是最佳选择。