我部署在beantalk上的Flask API偶尔会向调用它的JS返回值

时间:2019-03-20 21:41:30

标签: javascript python flask xmlhttprequest amazon-elastic-beanstalk

我在Beanstalk上有一个flask应用程序,看起来像这样:

application = Flask(__name__)
CORS(application)


@application.route('/price', methods=['GET', 'POST'])
def index():
    data = request.get_json()
    zip = data['zip']
    city = data['city']

    return_value = some_function_that_takes_about_one_minute()
    return str(return_value)


if __name__ == '__main__':
    application.debug = True
    application.run()

我正在使用google chrome扩展程序中的JS在Beanstalk上将此烧瓶端点称为如下代码:

var xhr = new XMLHttpRequest();


xhr.onload = function () {
    alert('This always runs...');
    alert(xhr.response);
};



xhr.open('POST', 'http://MYBEANSTALKURL/price', true);
xhr.timeout = 200000; 
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(JSON.stringify({ "zip": 90025.0, "city": "los_angeles"}));

这很好,并且chrome扩展成功调用了beantalk上的flask端点,并且根据日志,代码似乎可以运行。

但是将beantalk应用程序的输出返回到我的JS时出现问题。当我的烧瓶应用程序看起来像这样:

def index():
    data = request.get_json()
    zip = data['zip']
    city = data['city']

    return_value = some_function_that_takes_about_one_minute()
    return str(return_value)

flask应用程序似乎正在运行,但是什么也没有返回到JS代码,并且当beantalk应用程序返回奇怪的值时,似乎没有调用JS中的onload。如果我将烧瓶代码更改为此,尽管一切正常:

def index():
    data = request.get_json()
    zip = data['zip']
    city = data['city']
    return "Meow" 

然后突然将返回值返回到我的JS中,并调用了onload方法,并且此行:

 alert(xhr.response); 

在我的浏览器中弹出一个警告,提示“喵”。似乎此问题与beantalk flask应用程序返回的速度有关。当返回烧瓶应用返回非常快的内容(返回“喵”)时,chrome扩展名JS会获取值并显示出来。但是当flask应用程序端点花费的时间更长时,似乎什么也没返回。

似乎是超时问题或什么?或者,当它在烧瓶代码中更早返回时,它工作正常了,这是一条红色的鲱鱼,但它显然是相关的。无论如何,flasktalk上的flask应用程序中的python代码似乎都可以运行,但是似乎flask方法要花一会儿JS只是停止侦听响应...

编辑:同样,如果相关,以下是chrome扩展程序的manifest.json:

{
  "name": "A browser action with a popup that changes the page color",
  "description": "Change the current page color",
  "version": "1.0",
  "permissions": [
    "activeTab",
    "http://MYBEANSTALKURL/"
  ],
  "browser_action": {
      "default_title": "Set this page's color.",
      "default_icon": {
        "16": "icon.png",
        "32": "icon.png",
        "48": "icon.png",
        "128": "icon.png"
      },
      "default_popup": "popup.html"
  },
  "icons": {
    "16": "icon.png",
    "32": "icon.png",
    "48": "icon.png",
    "128": "icon.png"
  },
  "manifest_version": 2
}

编辑2:似乎当我向烧瓶端点添加time.sleep()时,它会产生一些有趣的结果。如果我这样做:

def index():
    data = request.get_json()
    zip = data['zip']
    city = data['city']
    time.sleep(0.05)
    return "Meow" 

然后,如果执行此操作,JS将工作并在警告按钮中显示返回值:

def index():
    data = request.get_json()
    zip = data['zip']
    city = data['city']
    time.sleep(1.0)
    return "Meow"

突然,它不再起作用。似乎确实有一些问题是由于烧瓶端点运行需要多长时间而引起的,但是我不知道为什么这会引起问题。

0 个答案:

没有答案