【问题标题】:Using requests module in flask route function在烧瓶路由功能中使用请求模块
【发布时间】:2014-04-05 08:49:46
【问题描述】:

考虑以下最小的工作烧瓶应用:

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 路由到 api 路由发出 GET 请求时 - 我在尝试访问 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()

所以我的问题是:为什么会发生这种情况,我该如何解决?

【问题讨论】:

  • 您实际上应该调用api 来获得结果。不要在您自己的应用程序上使用请求。

标签: python flask python-requests


【解决方案1】:

您正在使用 Flask 测试服务器运行 WSGI 应用程序,默认情况下,该服务器使用单个线程来处理请求。因此,当您的一个请求线程尝试回调到同一台服务器时,它仍在忙于处理该一个请求

您需要启用线程:

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

或者使用更高级的 WSGI 服务器;见Deployment Options

【讨论】:

  • 我不知道这一点(直到现在)。谢谢!
  • Flask.run() 来源看来,threaded 是一个 kwargs 选项,最终会下降到 werkzeug.serving.run_simple(),然后进一步下推到 @​​987654328@,然后是 return ThreadedWSGIServer。除了 run 方法之外,有没有办法为 Flask 应用程序实例触发这个?我正在尝试在flask_embed.py 此处看到的上下文中使用此选项,它将 Flask 应用程序嵌套在一些龙卷风对象中。
  • @jxramos:该代码使用不同的服务器来服务 WSGI 容器(保存 Flask 应用程序)。用线程服务器替换它。
  • 由于我试图支持的散景设置,我可能会受到 Tornado 服务器的限制。请参阅右侧的链接问题。到目前为止,Tornado 似乎是由设计single threaded 设计的。看来我需要加深对 Bokeh 对 Tornado 的依赖的理解。
猜你喜欢
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多