python - 如果接收到 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.py
or运行它gunicorn --keyfile 'server.key' --certfile 'server.crt' --bind '0.0.0.0:5000' 'server:create_flask_app()'
并打开浏览器窗口会localhost:5000
导致服务器挂起。
解决方案
推荐阅读
- swift - 设置 lightContent 上 statusBarStyle 的警告消息
- thingsboard - 我无法从 Flespi 的 Thingsboard 上的设备接收遥测数据
- android - 如何在纵向和横向的Android背景上创建纯色弧
- loops - SAS 如何为具有多行的组进行计算
- python - 如何最好地为 mongodb 文档建模不同的模式/模型版本?
- discord.py - 对系统消息的反应 discord.py
- python - 使用 Redis 和 Python 保存德语变音符号
- python - 什么是多项式/线性核特征图?
- c# - 如何通过 API 在 Gitlab 中编辑问题?
- reactjs - Nexted 样式的组件节点及其子节点未出现在反应测试库 DOM 中