首页 > 解决方案 > 如果接收到 http 请求,带有 ssl_context 的烧瓶服务器会冻结

问题描述

我正在尝试创建一个简单的烧瓶服务器,将任何 http 请求重定向到 https。我已经创建了一个证书和密钥文件并注册了一个before_request钩子,以查看请求是否安全并正确重定向,遵循建议这个 SO answer

烧瓶服务器按预期响应 https 请求。但是,当我发送一个 http 请求时,before_request钩子永远不会被调用,并且服务器永远挂起。如果我从浏览器发送 http 请求,我会看到“ERR_EMPTY_RESPONSE”。之后服务器甚至不响应 https 请求。也没有打印日志。

用 gunicorn 运行应用程序也没有帮助。唯一的区别是 gunicorn 能够检测到工人被冻结并最终杀死并替换它。我也尝试过使用flask-talisman,结果相同。

下面是我正在运行的代码

### server.py
from flask import Flask, request, redirect


def verify_https():
    if not request.is_secure:
        url = request.url.replace("http://", "https://", 1)
        return redirect(url, 301)


def create_flask_app():
    app = Flask(__name__)
    app.before_request(verify_https)
    app.add_url_rule('/', 'root', lambda: "Hello World")
    return app


if __name__ == '__main__':
    app = create_flask_app()
    app.run(
        host="0.0.0.0",
        port=5000,
        ssl_context=('server.crt', 'server.key')
    )

使用python3.8 server.pyor运行它gunicorn --keyfile 'server.key' --certfile 'server.crt' --bind '0.0.0.0:5000' 'server:create_flask_app()'并打开浏览器窗口会localhost:5000导致服务器挂起。

标签: pythonflaskhttpsgunicorn

解决方案


推荐阅读