我正在尝试使用flask开发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客户端获得响应。
为什么烧瓶无法服务于内部服务电话?
答案 0 :(得分:1)
我猜您使用的是单线程开发服务器,而不是WSGI设置用于生产。
由于服务器只有一个线程,因此一次只能处理一个请求。第一个请求将被执行,导致requests.get(...)
将打开第二个请求,在第一个请求完成之前无法处理,这是一个死锁。
最好的解决方案是调用triggerSub()
来获取结果,而不是使用HTTP请求。