在Flask路由函数中使用requests模块
考虑下面这个简单的 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服务器;可以查看一下部署选项。