返回redirect()和render_template()什么都不做(Python Flask)

问题描述 投票:0回答:1

我是 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 -
flask http-redirect
1个回答
0
投票

查看您的示例 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`;
© www.soinside.com 2019 - 2024. All rights reserved.