You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:03:18