001. Flask + Hypercorn 搭建 HTTP2 服务器
框架介绍
Flask 是一个轻量级的 Python Web 框架,Hypercorn 是一个使用 asyncio 的 Python WSGI 服务器。可以使用这两个工具来搭建一个支持 HTTP2 的 Web 服务器。
环境介绍
系统:Windows 10
Python:3.10.0
浏览器:Microsoft Edge(版本 107.0.1418.35)
搭建步骤
首先,需要安装 Flask 和 Hypercorn:
然后,你可以创建一个 Flask 应用来处理 HTTP 请求。例如,可以使用以下代码创建一个简单的 Flask 应用:
接下来,你可以使用 Hypercorn 来启动你的 Flask 应用。例如,可以使用以下代码启动服务器:
此时通过浏览器访问
来访问你的 Flask 应用了,你将看到一个 HelloWorld 界面。http://127.0.0.1:443

打开控制台的网络面板,勾选标题选项的协议,查看当前HTTP协议发现并未启用HTTP2。

仍为HTTP1.1协议
这是因为,你需要在服务器上安装 SSL 证书才能启用 HTTP2。你可以使用 Let's Encrypt 或其他方式来获取 SSL 证书(以后我会写一篇文章专门讲解)。然后,可以使用以下代码来配置 Hypercorn:
这样,你就可以通过浏览器访问
来访问你的 Flask 应用了,效果如下:https://127.0.0.1


已启用HTTP2
附:SSL Error处理
使用Hypercorn时,在与客户端进行 SSL 握手期间,可能会引发 SSLError 。这些错误由 asyncio 的 Event Loop 处理,并通过 Loop 的异常处理程序报告(通常直接抛出)。要忽略(或处理)这些错误,需要配置 Event Loop 的异常处理程序。
关于这个问题,Hypercorn 作者 pgjones 回答如下:
This is a Hypercorn issue - I don't think it causes any noticeable problems though? As I understand it Hypercorn tries to send information after the socket has closed and things then error and Hypercorn restarts on the next request. If it is problematic try using Uvicorn until this is fixed.

延伸阅读
为什么使用HTTP2?:https://www.cnblogs.com/jesse131/p/11529931.html
asyncio 事件循环错误处理API:https://docs.python.org/zh-cn/3/library/asyncio-eventloop.html#error-handling-api
Hypercorn 文档地址:https://hypercorn.readthedocs.io/en/latest/index.html
Hypercorn Github 地址:https://github.com/pgjones/hypercorn