【问题标题】:How to loop GETs until a certain response is received如何循环 GET 直到收到某个响应
【发布时间】:2019-01-11 10:42:00
【问题描述】:

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

我的任务是设置一个烧瓶路由,该路由 POST 到 API endpoint X,在 X 的响应中接收一个新的 endpoint Y,然后从 endpoint Y 获取 重复,直到在 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

【问题讨论】:

    标签: python flask get


    【解决方案1】:

    这更像是一个架构问题,而不是 Flask 问题。 Flask 视图中长时间运行的任务总是一个糟糕的设计选择。在这种情况下,路由的响应取决于另一个服务器的两个端点。实际上,除了承担您的应用程序的责任之外,您还承担了另一台服务器的责任。

    由于应用程序的设计似乎是另一个服务的代理,我建议以正确的方式创建代理。就像book()PRICING_ENDPOINT POST 请求提供代理一样,为POLL_ENDPOINT GET 请求创建另一个路由并将轮询逻辑移至客户端代码(JS)。

    更新: 如果由于某种原因您不能在类似隐藏代理的情况下使用POLL_ENDPOINT 信息信任客户端(浏览器-> JS),那么可以将轮询移至诸如 Celery 或 Python RQ 之类的任务运行器。虽然它会为您的应用程序引入额外的组件,但这将是正确的方法。

    【讨论】:

    • 感谢您的快速回答 - 不幸的是,我的选择仅限于我可以放置轮询逻辑的位置,因此涉足 Python。但如果 Python 看起来不合适,我会牢记您的建议并考虑其他选项。
    【解决方案2】:

    您可能会收到该错误,因为您的 API 服务器正在循环中的 HTTP 连接超时。 HTTP 时间连接有一些标准,并且循环花费了更多允许连接的时间。第一个(直接)解决方案是“玩”Apache 配置并增加 wsgi 的 HTTP 连接时间。您还可以建立一个套接字连接,并在其中检查更新状态并在达到目标时关闭它。或者您可以将您的逻辑移动到客户端。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      • 2021-05-26
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      相关资源
      最近更新 更多