Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何循环获取,直到收到某个响应_Python_Flask_Get - Fatal编程技术网

Python 如何循环获取,直到收到某个响应

Python 如何循环获取,直到收到某个响应,python,flask,get,Python,Flask,Get,我正在寻找有关以下方面的建议或相关教程: 我的任务是设置一个烧瓶路由,该路由发送到API端点X,在X的响应中接收一个新的端点Y,然后重复从端点Y,直到它在Y的响应体中接收到某个状态消息,然后返回Y的响应 下面的代码(编辑的无关数据)以一种非常愚蠢的方式实现了这个目标。它偶尔返回适当的数据,但不可靠。(60%的时间超时。)当我非常彻底地记录控制台日志时,似乎我的服务器陷入了多个while循环不断运行的困境,相互干扰 我偶尔也会收到此错误: SIGPIPE:根据请求/book向封闭管道/套接字/fd

我正在寻找有关以下方面的建议或相关教程:

我的任务是设置一个烧瓶路由,该路由发送到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