Я новичок в 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 -
@PatrickYoder Нет, я собирался это сделать, но отвлекся. Я сделаю это и обновлю пост как можно скорее.
Хорошо спасибо. Почему бы вам не использовать что-то вроде этого вместо js? <a href = "{{ url_for('test_render', name='Bob') }}">(Test render) Change name to "Bob"</a>
Глядя на ваш пример в 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`;
Вы пытались создать минимальный воспроизводимый пример? Например, вы пробовали использовать примеры, приведенные в Кратком руководстве по Flask? Это может помочь нам сузить проблему.