在Flask路由函数中使用requests模块

4 投票
1 回答
5674 浏览
提问于 2025-04-18 01:27

考虑下面这个简单的 Flask 应用:

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "I am /"

@app.route("/api")
def api():
    return "I am /api"

if __name__ == "__main__":
    app.run()

这个应用运行得很好。但是当我尝试从 hello 路由用 "requests" 模块发起一个 GET 请求到 api 路由时,我在浏览器中访问 http://127.0.0.1:5000/ 时却没有收到任何响应。

from flask import Flask
import requests

app = Flask(__name__)

@app.route("/")
def hello():
    r = requests.get("http://127.0.0.1:5000/api")
    return "I am /" # This never happens :(

@app.route("/api")
def api():
    return "I am /api"

if __name__ == "__main__":
    app.run()

所以我想问的是:为什么会出现这种情况,我该怎么解决呢?

1 个回答

11

你正在用Flask的测试服务器运行你的WSGI应用。这个服务器默认只用一个线程来处理请求。所以当你的请求线程想要再调用同一个服务器时,它仍然在忙着处理那个请求

你需要开启线程功能:

if __name__ == "__main__":
    app.run(threaded=True)

或者使用一个更高级的WSGI服务器;可以查看一下部署选项

撰写回答