Python Flask中requests.get调用内部接口无响应问题咨询
问题原因分析
你遇到的这个问题核心在于Flask默认开发服务器的单线程特性。当你访问/路由时,服务器会启动一个线程处理当前请求,而在home()函数里你又用requests.get()请求同一个服务器的/welcome路由——这时候单线程已经被当前的/请求占用,根本腾不出资源处理新的/welcome请求,于是陷入了无限等待的死锁状态,浏览器自然持续加载,终端也没有预期输出。
而请求外部URL时,请求是发给第三方服务器的,不会占用当前Flask服务器的线程,所以能正常拿到响应。
解决方案
针对这个问题,有几个可行的解决方向,你可以根据需求选择:
1. 开启Flask开发服务器的多线程模式
Flask的app.run()方法支持threaded=True参数,开启后服务器会用多线程处理请求,这样就能同时响应/和/welcome的请求了:
from flask import * import requests app = Flask(__name__) @app.route('/') def home(): r = requests.get('http://127.0.0.1:5000/welcome') print(r) return render_template('home.html') @app.route('/welcome') def welcome(): # 修正你之前拼写错误的`wecome` print("welcome page") return "welcome to my page" if __name__=='__main__': app.run(debug=True, threaded=True) # 添加threaded=True开启多线程
2. 使用Flask测试客户端做内部请求
如果你的需求是调用应用内其他路由的逻辑,没必要通过HTTP请求绕一圈,直接用Flask内置的test_client()模拟请求,效率更高且不会有线程冲突:
from flask import * import requests app = Flask(__name__) @app.route('/') def home(): # 用测试客户端发起内部请求 with app.test_client() as client: response = client.get('/welcome') print(response) print(response.get_data(as_text=True)) # 可直接获取响应内容 return render_template('home.html') @app.route('/welcome') def welcome(): print("welcome page") return "welcome to my page" if __name__=='__main__': app.run(debug=True)
3. 改用生产级服务器(部署阶段适用)
如果是在生产环境,推荐使用Gunicorn、uWSGI这类支持多进程/多线程的服务器,它们默认就能处理并发请求,不会出现单线程死锁问题。比如用Gunicorn启动:
gunicorn -w 4 your_app:app # -w指定工作进程数量,可根据服务器配置调整
总结
开发阶段最适合你的方案是开启多线程模式或使用测试客户端,后者更适合内部逻辑调用的场景。另外记得修正函数名的拼写错误,避免后续出现不必要的问题。
内容的提问来源于stack exchange,提问作者Houy Narun
相关产品推荐
相关产品推荐

