Python 如何循环获取,直到收到某个响应
我正在寻找有关以下方面的建议或相关教程: 我的任务是设置一个烧瓶路由,该路由发送到API端点X,在X的响应中接收一个新的端点Y,然后重复从端点Y,直到它在Y的响应体中接收到某个状态消息,然后返回Y的响应 下面的代码(编辑的无关数据)以一种非常愚蠢的方式实现了这个目标。它偶尔返回适当的数据,但不可靠。(60%的时间超时。)当我非常彻底地记录控制台日志时,似乎我的服务器陷入了多个while循环不断运行的困境,相互干扰 我偶尔也会收到此错误: SIGPIPE:根据请求/book向封闭管道/套接字/fd(可能是客户端断开连接)写入数据Python 如何循环获取,直到收到某个响应,python,flask,get,Python,Flask,Get,我正在寻找有关以下方面的建议或相关教程: 我的任务是设置一个烧瓶路由,该路由发送到API端点X,在X的响应中接收一个新的端点Y,然后重复从端点Y,直到它在Y的响应体中接收到某个状态消息,然后返回Y的响应 下面的代码(编辑的无关数据)以一种非常愚蠢的方式实现了这个目标。它偶尔返回适当的数据,但不可靠。(60%的时间超时。)当我非常彻底地记录控制台日志时,似乎我的服务器陷入了多个while循环不断运行的困境,相互干扰 我偶尔也会收到此错误: SIGPIPE:根据请求/book向封闭管道/套接字/fd
这与其说是烧瓶问题,不如说是架构问题。在Flask视图中长时间运行的任务总是一个糟糕的设计选择。在这种情况下,路由的响应依赖于另一台服务器的两个端点。实际上,除了承担应用程序的责任外,您还承担另一台服务器的责任 由于应用程序的设计似乎是另一个服务的代理,我建议以正确的方式创建代理。就像
book()
为PRICING\u ENDPOINT
POST请求提供代理一样,为POLL\u ENDPOINT
GET请求创建另一个路由,并将轮询逻辑移动到客户端代码(JS)
更新:
如果由于某种原因,您无法在类似代理的隐藏情况下使用
POLL\u端点
信息信任客户端(browser->JS),那么可以将轮询移动到类似芹菜或Python RQ的任务运行程序。尽管它会为应用程序引入额外的组件,但这是正确的做法。可能是由于API服务器的HTTP连接超时而导致该错误。HTTP时间连接有一些标准,循环占用了连接所允许的更多时间。第一个(直接的)解决方案是“玩”ApacheConfigs并增加wsgi的HTTP连接时间。您还可以建立套接字连接,在其中检查更新状态,并在目标实现时关闭它。或者,您可以将逻辑移到客户端。感谢您的快速回答-不幸的是,我的选项对于放置轮询逻辑的位置是有限的,因此我尝试了Python。但我会把你的建议放在心上,如果Python看起来不合适的话,我会考虑其他的选择。
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