Возврат 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? Это может помочь нам сузить проблему.

Patrick Yoder 26.07.2024 16:31

@PatrickYoder Нет, я собирался это сделать, но отвлекся. Я сделаю это и обновлю пост как можно скорее.

Paul 26.07.2024 17:20

Хорошо спасибо. Почему бы вам не использовать что-то вроде этого вместо js? <a href = "{{ url_for('test_render', name='Bob') }}">(Test render) Change name to "Bob"</a>

Patrick Yoder 27.07.2024 20:26
Новые приложения с использованием ChatGPT
Новые приложения с использованием ChatGPT
Я собираюсь вернуться к теме, которую уже освещал ранее, - чатгпт.
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Другой маршрут в Flask Python
Другой маршрут в Flask Python
Flask - это фреймворк, который поддерживает веб-приложения. В этой статье я покажу, как мы можем использовать @app .route в flask, чтобы иметь другую...
0
3
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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`;

Другие вопросы по теме