使用Flask改善Python中HTTP请求功能的延迟

时间:2018-10-17 01:27:07

标签: python api flask python-requests big-o

但是,在使用Eventbrite的API为其事件提供网站支持的过程中,我仍然坚持如何实现项目。

当前,我想通过日期过滤事件并将其显示在首页上,但是,Eventbrite API限制为每页仅50个项目。 API请求推出86个页面,每个页面包含50个项目。

如何在降低延迟的同时呈现这些事件? 我目前所需要的时间为104秒,然后将结果呈现到页面上。我正在尝试大O符号表示法,但我想我正在使用O(n²)。

代码如下:

routes.py:

from flask import Flask, render_template
from eventbrite import Eventbrite
from datetime import datetime

import requests, json

app = Flask(__name__)


# TODO: Remove outh key in file and register in sys
oKey = ‘<oauth-key>’

o_token_url = '&token={0}'.format(oKey)

@app.route("/")
def index():

    base_url = 'https://www.eventbriteapi.com/v3/'
    regions_url = base_url + 'system/regions/?token={0}'.format(oKey)
    regions_result = requests.get(regions_url)
    regions_obj = regions_result.json()

    e_url = base_url + 'events/search/?token={0}&location.address=<city>&start_date.range_start=2018-07-02T12%3A00%3A00Z&page=2'.format(oKey)
    e_result = requests.get(e_url)
    e_obj = e_result.json()

   list_events = []

    for pg in range(1, e_obj['pagination']['page_count']):
        print(pg)
        startTime = datetime.now()

        e_url = base_url + 'events/search/?token={0}&location.address=<city>&start_date.range_start=2018-07-02T12%3A00%3A00Z&page={1}'.format(oKey, pg)
        e_result = requests.get(e_url)
        e_obj = e_result.json()

        for i in e_obj['events']:
            an_event = {}
            an_event['name'] = i['name']['text']
            list_events.append(htx_event)

    print(datetime.now() - startTime)
    return render_template('index.html', events=list_events)

if __name__ == "__main__":
    app.run(host='0.0.0.0')

index.html:

{% for event in events %}
{{event['name']}}<br>

{% endfor %}

我知道EB API批处理请求endpoint,但是我无法确定如何发送带有请求的url词典列表。

任何有关如何优化上面代码的技巧将不胜感激。我想我可以限制在任何给定时间显示的事件数量,但是对其他人如何处理此问题感兴趣。

1 个答案:

答案 0 :(得分:2)

这需要很长时间,不是因为它是CPU密集型操作(可以通过算法优化来解决),而是因为每个HTTP请求都需要时间。为了缓解这种情况,您可以make requests concurrent (i.e. simultaneous)。为了进一步减少延迟,您可以tune re-use of TCP connections,这样就不会浪费时间为每个HTTP请求创建TCP连接。