Возврат redirect() и render_template() ничего не делает (Python Flask)

Я новичок в Flask, поэтому прошу прощения, если упускаю что-то очевидное. Я создал базового чат-бота RAG, которому можно задавать вопросы по конкретному документу с инструкциями по комплекту проекта. Я использую меню, из которого пользователь выберет конкретный комплект, и когда будет выбран новый комплект, он отправит новый запрос на маршрут «/» с новыми параметрами запроса. Страница должна быть повторно отображена с использованием новых параметров запроса, переданных в качестве контекста функции render_template(). Параметрами являются коллекция цветности (collection) и метаданные (name), которые я использую для запроса вложений цветности.

Например, на моей странице есть абзац «Пожалуйста, задавайте мне любые вопросы о наборе {{ name }}!» После запроса оно должно обновиться до имени текущего комплекта, но оно не изменится. Я также передаю переменные контекста в запрос на получение, который получает ответ от чат-бота. Все остальное работает, но переменные контекста не меняются.

Мне не удалось реализовать этот подход, поэтому я решил сначала перенаправить на новый URL-адрес с обновленными параметрами запроса, а затем визуализировать страницу после ее перенаправления. Это тоже не работает. Код, который я приложил, взят из этой попытки. Я добавил новый параметр запроса r, для которого установлено значение 1 для перенаправления страницы, а любое другое значение должно просто возвращать render_template().

Я думаю, что это может быть проблема с кэшированием, но я не уверен, так ли это и как это исправить. Я использую последнюю версию Chrome на Mac M1 Max. Если есть более простой или лучший способ сделать это, пожалуйста, дайте мне знать. Спасибо за помощь!

TLDR: Кажется, все работает, и вывод кажется правильным, но фактическая веб-страница и URL-адрес вообще не меняются, когда я перенаправляю или отображаю страницу. Мне нужно вручную ввести новый URL-адрес, чтобы обновить страницу.

Обновлено: я воспроизвел эту проблему в минимальном приложении Flask, следуя тому же подходу. Я загрузил выходные данные app.py, index.html и Flask здесь: https://github.com/pauburk/flask-bug-2024.

приложение.py:

@app.route("/")
def home():
    r = int(request.args.get("r")) if request.args.get("r") else 0
    collection = request.args.get("collection")
    name = request.args.get("name")

    print("current params:  ", collection, name, r, type(r), file=sys.stderr)
    
    if r == 1:
        url = url_for(".home", collection=collection, name=name) # _external=True, 
        print(f"redirecting to '{url}'...", file=sys.stderr)
        return redirect(url, code=302)
    else:
        print("rendering...", file=sys.stderr)
        return render_template("index.html", collection=collection, name=name, populated_buttons=Markup(populated_buttons_html))

индекс.html:

function changeTo(collection_value, name_value) {
    $.get("/", { r: 1, collection: collection_value, name: name_value }).done(function () {
        # hide menu modal
    });
}

вывод колбы в терминале: (для ясности добавлены имена к напечатанным параметрам)

$ python3 app.py

 * Serving Flask app 'app'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit
current params:  collection = "idea_sheets", name = "Puppy Programming" r=0 <class 'int'>
rendering...
127.0.0.1 - - [24/Jul/2024 11:50:01] "GET /?r=0&collection=idea_sheets&name=Puppy%20Programming HTTP/1.1" 200 -
127.0.0.1 - - [24/Jul/2024 11:50:01] "GET /static/images/bot-logo.png HTTP/1.1" 304 -
127.0.0.1 - - [24/Jul/2024 11:50:01] "GET /static/styles/app.css HTTP/1.1" 304 -

current params:  collection = "idea_sheets" name = "Puff Rocket" r=1 <class 'int'>
redirecting to '/?collection=idea_sheets&name=Puff+Rocket'...
127.0.0.1 - - [24/Jul/2024 11:50:03] "GET /?r=1&collection=idea_sheets&name=Puff%20Rocket HTTP/1.1" 302 -

current params:  collection = "idea_sheets" name = "Puff Rocket" r=0 <class 'int'>
rendering...
127.0.0.1 - - [24/Jul/2024 11:50:03] "GET /?collection=idea_sheets&name=Puff+Rocket HTTP/1.1" 200 -

🤔 А знаете ли вы, что...
Flask поддерживает множество методов HTTP, включая GET, POST, PUT и DELETE.


88
1

Ответ:

Решено

Глядя на ваш пример в https://github.com/pauburk/flask-bug-2024...

В вашем шаблоне index_simple.html вы используете jQuery для создания запроса AJAX GET с обновленным именем. Запросы AJAX не перезагружают страницу автоматически и не изменяют URL-адрес. Они предназначены для обновления частей страницы без полной перезагрузки.

Перенаправление после AJAX: Когда вы возвращаете перенаправление в ответ на запрос AJAX, браузер не следует автоматически за этим перенаправлением. Ответ на перенаправление возвращается в JavaScript, выполнивший вызов AJAX, но не влияет на текущую страницу.

Вместо вызова AJAX с помощью:

$.get("/test_render/", { name: "Bob" });

вы можете использовать простую ссылку <a href = "..." или заставить браузер обновить URL-адрес следующим образом:

window.location.href = `/test_render/?name=Bob`;