Повторный рендеринг с неработающим render_template - PullRequest
0 голосов
/ 29 марта 2020

Flask не перерисовывает страницу шаблона с новой переменной.

Flask код (app.py):

from flask import Flask, render_template, request, redirect, url_for

app = Flask(__name__)


@app.route("/",methods = ['GET', 'POST'])
@app.route("/<value>",methods = ['GET', 'POST'])
def index(value=1):
    print(value)
    return render_template('home.html',number=value)

@app.route("/next",methods = ['GET', 'POST'])
def next():
    if request.method == 'POST':
        last_num = list(dict(request.form).keys())[0]
        last_num = int(last_num)
        return redirect(url_for("index",value=last_num+1))

if __name__ == '__main__':
    app.run()

HTML page (home. html):

<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script>
$(function() {
    $('#submit').click(function() {
        $.ajax({
            url: '/next',
            data: String(Number(document.getElementById("number").textContent)),
            type: 'POST',
            success: function(response) {
                console.log("Awesome");
            },
            error: function(error) {
                console.log(error);
            }
        });
    });
});
</script>
</head>
<body>

<div id="number">
  {{number}}
</div>
<button type="button" id="submit">Next</button>

</body>
</html>

(последнее) число на странице HTML хорошо достигает кода flask, а функция index также получает увеличенное значение. Но страница HTML не перезагружается с новой переменной number.

1 Ответ

1 голос
/ 29 марта 2020

Пара вещей.

Во-первых, вы можете интерполировать ваши flask переменные непосредственно в JavaScript. Это может вызвать ошибки в вашем редакторе (не в этом случае), но когда страница отображается, она будет работать правильно. (ie. data: "{{ number|safe }}")

Во-вторых, вы не перенаправляете клиента. Вы возвращаете перенаправление из своего вызова API, но не выполняете его. Эта функция работает, только если вы отображали конечную точку /next как свою страницу. Вместо этого вы должны вернуть URL, по которому клиент должен перейти. Вы можете установить URL страницы несколькими способами в JavaScript. Если вы просто хотите перезагрузить страницу, поместите location.reload(true) в ваш обработчик успеха. (установив forceGet в true, вы предотвратите перезагрузку браузера из кеша, чтобы сервер фактически обновил переменную на странице). Обратите внимание, что если вы сделаете это, вам нужно будет хранить переменную глобально на вашем бэкэнде, иначе она не будет обновляться. Это может быть вашей проблемой сейчас (если вы каждый раз вручную перезагружаете страницу): ваша переменная передается только через редирект, который снова не отслеживается и не рендерится.

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

Надеюсь, это поможет. Пожалуйста, дайте мне знать, если я неправильно понял вашу проблему или я допустил ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...