我正在寻找有关以下方面的建议或相关教程:
我的任务是设置一个烧瓶路由,该消息路由到API 端点X 的POST,在X的响应中接收到新的端点Y ,然后从端点Y获取GET ,直到它在Y的响应正文中收到某个状态消息,然后返回Y的响应。
(未编辑的相关数据)下面的代码以非常愚蠢的方式实现了这一目标。它偶尔但不可靠地返回适当的数据。 (它超时的时间为60%。)当我非常彻底地控制台日志时,似乎好像由于多个while循环不断运行,互相干扰而使服务器陷入瘫痪。
我偶尔也会收到此错误:
SIGPIPE:根据请求/ book写入封闭的管道/套接字/ fd(可能客户端已断开连接)
import sys, requests, time, json
from flask import Flask, request
# create the Flask app
app = Flask(__name__)
# main booking route
@app.route('/book', methods=['POST']) #GET requests will be blocked
def book():
# defining the api-endpoints
PRICING_ENDPOINT = ...
# data to be sent to api
data = {...}
# sending post request and saving response as response object
try:
r_pricing = requests.post(url = PRICING_ENDPOINT, data = data)
except requests.exceptions.RequestException as e:
return e
sys.exit(1)
# extracting response text
POLL_ENDPOINT = r_pricing.headers['location']
# setting data for poll
data_for_poll = {...}
r_poll = requests.get(POLL_ENDPOINT, data = data_for_poll)
# poll loop, looking for 'UpdatesComplete'
j = 1
poll_json = r_poll.json()
update_status = poll_json['Status']
while update_status == 'UpdatesPending':
time.sleep(2)
j = float(j) + float(1)
r_poll = requests.get(POLL_ENDPOINT, data = data_for_poll)
poll_json = r_poll.json()
update_status = poll_json['Status']
return r_poll.text
答案 0 :(得分:1)
与Flask问题相比,这更多的是架构问题。在Flask视图中长时间运行的任务始终是一个糟糕的设计选择。在这种情况下,路由的响应取决于另一台服务器的两个端点。实际上,除了承担您的应用程序的责任外,您还承担了另一台服务器的责任。
由于应用程序的设计似乎是另一项服务的代理,因此我建议以正确的方式创建代理。就像book()
为PRICING_ENDPOINT
POST请求提供代理一样,为POLL_ENDPOINT
GET请求创建另一个路由,并将轮询逻辑移至客户端代码(JS)。
更新:
如果您出于某种原因不能在隐藏代理之类的情况下以POLL_ENDPOINT
信息信任客户端(浏览器-> JS),则可以将轮询移至Celery或Python RQ之类的任务运行器。虽然,它将为您的应用程序引入其他组件,但这是正确的方法。
答案 1 :(得分:0)
由于与正在循环的API服务器的HTTP连接超时,可能会收到该错误。 HTTP时间连接有一些标准,并且循环花费了连接所允许的更多时间。第一个(直接)解决方案是“玩” Apache配置,并增加wsgi的HTTP连接时间。您也可以建立套接字连接,并在其中检查更新状态并在达到目标时将其关闭。或者,您可以将逻辑移到客户端。