Flask请求中HTTP调用失败,命令行执行正常的原因排查
Flask/Django开发服务器中HTTPS请求失败,但命令行执行正常的问题
问题概述
在开发Flask或Django应用时,出现异常现象:在请求处理上下文内发起对外HTTPS调用会失败,但直接在Python命令行中执行相同的请求逻辑却能成功。
复现代码
简化后的Flask应用代码(保存为sslerror.py):
import requests from flask import Flask app = Flask(__name__) @app.route("/") def hello_world(): try: response = requests.get("https://httpbin.org/get") data = response.json() except Exception as e: print(f"Caught exception {e}") data = "no data: error" return(f'<pre>{data}</pre>')
需提前安装依赖:flask、requests
场景对比
Flask开发服务器场景
使用命令启动应用:
flask --app sslerror run
应用监听http://127.0.0.1:5000,浏览器访问时触发错误,控制台输出:
Caught exception HTTPSConnectionPool(host='httpbin.org', port=443): Max retries exceeded with url: /get (Caused by SSLError(SSLError(0, 'unknown error (_ssl.c:3098)')))
Python命令行场景
在命令行执行以下代码,可成功获取结果:
>>> from sslerror import hello_world >>> hello_world() "<pre>{'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.31.0', 'X-Amzn-Trace-Id': 'Root=1-652f409a-abcdefabcdef'}, 'origin': '108.x.x.x', 'url': 'https://httpbin.org/get'}</pre>"
Gunicorn启动场景
安装gunicorn后使用命令启动:
gunicorn -w 1 sslerror:app
应用监听http://127.0.0.1:8000,浏览器访问可正常返回结果。
环境信息
- 操作系统:MacOS 13.6(Ventura),Apple M2芯片
- Python环境:pyenv管理的Python 3.11.5
已尝试方案
在requests.get()中添加verify=False和allow_redirects=False参数,问题未解决,报错现象一致。
后续测试更新
- 在pyenv管理的Python 3.8、Homebrew安装的Python 3.11虚拟环境中测试,现象完全一致;
- 将
requests替换为httpx库发起请求,问题依旧; - 在Django runserver进程中发起HTTPS调用,出现相同错误;
- 将请求URL改为HTTP协议时,Flask应用中可正常执行,但目标服务仅支持HTTPS。
问题咨询
为何对外HTTPS请求在Flask/Django请求上下文执行失败,命令行执行却正常?
内容的提问来源于stack exchange,提问作者Doug Harris
相关产品推荐
相关产品推荐

