如何循环获取,直到收到特定的响应

时间:2019-01-11 10:42:01

标签: python flask get

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

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

2 个答案:

答案 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连接时间。您也可以建立套接字连接,并在其中检查更新状态并在达到目标时将其关闭。或者,您可以将逻辑移到客户端。

相关问题