【问题标题】:Flask restful GET doesn't respond within appFlask restful GET在应用程序内没有响应
【发布时间】:2017-10-23 03:10:35
【问题描述】:

我有一个带有端点的烧瓶 restful api

api.add_resource(TestGet, '/api/1/test')

我想使用来自该端点的数据来填充我的 jinja 模板。但是每次我尝试在这样的示例路线中调用它

@app.route('/mytest') def mytest(): t = get('http://localhost:5000/api/1/test') 它从不返回任何东西并停留在循环中,这意味着它正在处理请求并且永远不会返回。我不能在同一个烧瓶应用程序中调用它有什么原因吗?我能够通过浏览器和另一个 python REPL 到达端点。完全混淆了为什么会发生这种情况以及为什么它永远不会返回任何东西。至少预计会出错。

这是我尝试运行的整个示例

from flask import Flask
from requests import get

app = Flask('test')

from flask_restful import Api, Resource

api = Api(app)

class TestGet(Resource):
    def get(self):
        return {'test': 'message'}

api.add_resource(TestGet, '/test')

@app.route('/something')
def something():
    resp = get('http://localhost:5000//test').json
    print(resp)
from gevent.wsgi import WSGIServer
WSGIServer(('', 5000), app).serve_forever()

【问题讨论】:

    标签: python flask flask-restful


    【解决方案1】:

    如果您只想调试程序,请使用 app.run(threaded=True)。这将为每个请求启动一个新线程。

    【讨论】:

    • 酷。这是一个快速解决问题的方法。关于@timofey 提到的关于烧瓶限制的任何想法?这可能超出了范围,但现在添加一个不仅仅是单线程的服务器有望有所帮助。我想使用 gunicorn 之类的东西,但在 Windows 上决定使用 gevent 进行开发。
    • 我通常在 linux 上使用 gunicorn 和 gevent worker。也许 uwsgi 可以在 Windows 上运行?另外,如果你用的是win10,我会推荐它的ubuntu子系统。
    • 这很奇怪。您知道使 gevent 以类似方式工作的配置吗?我必须在上面进行配置,但从来没有让它工作。只是调试服务器工作。
    • 如果您要在代码中使用 gevent wsgi,则有必要 monkey patch 您的代码,因为 gevent 无法处理阻塞内置函数。我用这样的主管在命令中运行 gunicorn:gunicorn -k gevent_wsgi -b 0.0.0.0:8000 -w 4 myapp:app,它将自动进行猴子修补。
    【解决方案2】:

    请参阅此 SO 线程,其中包含对 Flask 限制的很好解释:https://stackoverflow.com/a/20862119/5167302 具体来说,在你的情况下,你正在打这个:

    您可能会遇到的主要问题是服务器是单线程的。这意味着它将按顺序依次处理每个请求。这意味着,如果您尝试处理多个请求(包括网站图标、图像、CSS 和 Javascript 文件等静态项目等),请求将花费更长的时间。如果任何给定的请求碰巧需要很长时间(例如 20 秒),那么您的整个应用程序在这段时间内(20 秒)都没有响应。

    因此,通过在请求中发出请求,您会使您的应用程序陷入僵局。

    【讨论】:

    • 我也是这么想的!所以我使用 gevent 添加了一个 WSGI 服务器。简单的 1 行 WSGIServer(('', 5000), app).serve_forever() 我认为这会有所帮助。但我仍然认为存在这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多