我是 Flask 新手,所以如果我遗漏了一些明显的东西,我深表歉意。我创建了一个基本的 RAG 聊天机器人,可以询问有关特定项目套件说明文档的问题。我使用一个菜单,用户可以从中选择一个特定的套件,当选择一个新的套件时,它将使用新的查询参数向路线“/”发送一个新的请求。页面应该使用作为上下文传递给 render_template() 的新查询参数重新呈现。参数是色度集合 (
collection
) 和我用来查询色度嵌入的元数据 (name
)。
例如,我的页面上有一段文字是“请向我询问有关
{{ name }}
套件的任何问题!”这应该在请求后更新为当前套件的名称,但它不会改变。我还将上下文变量传递给获取请求,该请求从聊天机器人获取响应。其他一切都有效,但上下文变量不会改变。
我无法使这种方法发挥作用,因此我决定首先使用更新的查询参数重定向到新的 url,然后在重定向后渲染页面。这也行不通。我附加的代码来自这次尝试。我添加了一个新的查询参数
r
,设置为 1
来重定向页面,任何其他值都应该返回 render_template()
。
我认为这可能是一个缓存问题,但我不确定是否是这样或者是否如何解决它。我在 Mac M1 Max 上使用最新版本的 Chrome。如果有更简单或更好的方法来做到这一点,请告诉我。谢谢您的帮助!
TLDR: 一切似乎都正常,输出似乎正确,但当我重定向或渲染页面时,实际的网页和网址根本没有改变。我必须手动输入新网址才能更新页面。
编辑:我按照相同的方法在最小的 Flask 应用程序中复制了这个问题。我在这里上传了 app.py、index.html 和 Flask 输出:https://github.com/pauburk/flask-bug-2024.
app.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))
index.html:
function changeTo(collection_value, name_value) {
$.get("/", { r: 1, collection: collection_value, name: name_value }).done(function () {
# hide menu modal
});
}
终端中的 Flask 输出:(为了清晰起见,在打印参数中添加了名称)
$ 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 -
查看您的示例 https://github.com/pauburk/flask-bug-2024...
在您的
index_simple.html
模板中,您使用 jQuery 发出带有更新名称的 AJAX GET 请求。 AJAX 请求不会自动重新加载页面或更改 URL。它们旨在更新页面的部分内容,而无需完全重新加载。
AJAX后重定向: 当您在 AJAX 请求的响应中返回重定向时,浏览器不会自动遵循该重定向。重定向响应将返回到进行 AJAX 调用的 JavaScript,但不会影响当前页面。
而不是使用以下方式发出 AJAX 调用:
$.get("/test_render/", { name: "Bob" });
您可以使用简单的
<a href="..."
链接或让浏览器更新 URL,如下所示:
window.location.href = `/test_render/?name=Bob`;