Возможно ли динамическое обновление отображаемого шаблона в Flask, на стороне сервера?

В настоящее время у меня есть веб-сервер Flask, который извлекает данные из JSON API с помощью встроенного объекта запросов.

Например:

def get_data():
    response = requests.get("http://myhost/jsonapi")
    ...
    return response

@main.route("/", methods=["GET"])
def index():
    return render_template("index.html", response=response)

Проблема здесь в том, что, естественно, метод GET запускается только один раз, когда вызывается первый get_data. Чтобы обновить данные, я должен остановить и перезапустить сервер wsgi Flask. Я пробовал обертывать различные части кода за время цикла True/sleep, но это предотвращает загрузку страницы werkzeug.

Каков самый Pythonic способ динамически получать данные, которые я хочу, не перезагружая страницу или перезагружая сервер?

Ответ 1

Вы обсуждаете, что может быть две разные проблемы.

  • Предположим, что проблема заключается в том, что вы вызываете динамический источник данных, get_data(), только один раз и сохраняете его (статическое) значение в глобальном response. Этот одноразовый вызов не отображается, но пусть он говорит где-то в вашем коде. Затем, если вы хотите обновить страницу (/), чтобы получать обновления, вы можете:

    @main.route("/", methods=['GET'])
    def index():
        return render_template("index.html", response=get_data())
    

    Это позволит получать свежие данные при каждой загрузке страницы.

  • Затем к концу вашего вопроса вы спрашиваете, как "ПОЛУЧИТЬ данные, которые я хочу, без перезагрузки страницы или перезагрузки сервера". Это совершенно другая проблема. Вам нужно будет использовать запросы AJAX или WebSocket в вашем коде. Существует довольно много учебников о том, как это сделать (например, этот), которые вы можете найти через Googling "Flask AJAX". Но для этого потребуется вызов JavaScript AJAX. Я рекомендую найти примеры того, как это делается путем поиска "Flask AJAX jQuery", поскольку jQuery будет абстрагироваться и упрощать то, что вам нужно делать на стороне клиента. Или, если вы хотите использовать WebSockets для соединения с более низкой задержкой между вашей веб-страницей, это также возможно; поиск примеров (например, как этот).