Увеличьте время ожидания функции HTTP-запроса в Python, используя Flask - PullRequest
0 голосов
/ 17 октября 2018

В процессе использования API Eventbrite для создания веб-сайта с его событиями, однако, я застрял в том, как реализовать проект.

В настоящее время я хочу отфильтровать события по датам и показать их наОднако на первой странице Eventbrite API ограничивается только 50 элементами на странице.Запрос API выдвигает 86 страниц по 50 позиций на каждой.

Как я могу представить эти события сразу, уменьшив время ожидания?То, что у меня сейчас есть, занимает 104 секунды, чтобы ответить и отобразить результаты на странице.Я поверхностно рассматриваю теорию обозначений Big O, однако, я думаю, что я использую O (n²).

вот код:

rout.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 конечная точка однако я не могу понять, как отправить список словарей URL с запросами.

Буду признателен за любые советы по оптимизации приведенного выше кода.Я подумал, что могу ограничить количество событий, отображаемых в любой момент времени, однако, интересуясь, как другие подойдут к этому вопросу.

1 Ответ

0 голосов
/ 17 октября 2018

Это занимает много времени не потому, что это ресурсоемкая операция (которую можно решить с помощью оптимизации алгоритма), а потому, что каждый HTTP-запрос требует времени.Чтобы смягчить это, вы можете делать запросы одновременными (т.е. одновременными) .Чтобы еще больше уменьшить задержку, вы можете настроить повторное использование TCP-соединений , чтобы не тратить время на создание TCP-соединения для каждого HTTP-запроса.

...