【问题标题】:Flask : Server not responding on internal API access [duplicate]Flask:服务器对内部 API 访问没有响应 [重复]
【发布时间】:2017-08-17 05:03:55
【问题描述】:

我正在尝试使用烧瓶开发 Web 应用程序,下面是我的代码,

from sample import APIAccessor
#API
@app.route('/test/triggerSecCall',methods=['GET'])
def triggerMain():
    resp = APIAccessor().trigger2()
    return Response(json.dumps(resp), mimetype='application/json') 

@app.route('/test/seccall',methods=['GET'])
def triggerSub():
    resp = {'data':'called second method'}
    return Response(json.dumps(resp), mimetype='application/json') 

而我的触发方法包含以下代码,

def trigger2(self):
      url = 'http:/127.0.0.1:5000/test/seccall' 
      response = requests.get(url) 
      response.raise_for_status()
      responseJson = response.json()
      if self.track:
          print 'Response:::%s' %str(responseJson)
      return responseJson

当我点击http://127.0.0.1:5000/test/seccall 时,我得到了预期的输出。当我点击/test/triggerSecCall 时,服务器停止响应。请求永远等待。 在这个阶段,我无法从任何其他 REST 客户端访问任何 API。当我强制停止服务器(Ctrl+C)时,我在second REST 客户端中得到响应。

为什么烧瓶不能为内部服务调用服务?

【问题讨论】:

    标签: python rest api flask


    【解决方案1】:

    我猜您使用的是单线程开发服务器,而不是用于生产的 WSGI 设置。

    由于服务器只有一个线程,一次只能处理一个请求。第一个请求将被执行,导致requests.get(...) 将打开第二个请求,直到第一个请求完成后才能处理,即死锁。

    最好的解决方案是直接调用 triggerSub() 来获取结果,而不是使用 HTTP 请求。

    【讨论】:

    • 是的!我打出同样的东西。更多信息可以在这里找到:stackoverflow.com/questions/38876721/…
    • 谢谢克劳斯和麦克麦克利什。我认为让我的应用程序在多线程中运行将解决我的问题。而且它只是一个很少有人使用的简单应用程序。
    • 嗯,这将是运行服务器多线程的解决方案,但这只会掩盖潜在的问题。如果您的 Web 应用程序没有在一个线程中运行,则说明它有问题。多线程也会使调试复杂化。
    • @MacMcIrish,该链接非常有用。我会毫不犹豫地考虑该线程中讨论的所有主题。
    • 如果您将它用于其他用途,则开发使用 WSGI 设置。 Guncorn 可以轻松上桌。
    猜你喜欢
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2019-05-27
    • 2021-08-13
    相关资源
    最近更新 更多