render_template和重定向之间的区别?


return redirect(url_for('index', var=var))
return render_template('index.html', var=var)

这两条线本质上是一回事吗?

这两个功能有什么区别?

>redirect向浏览器返回一个 302 标头,其Location标头作为index函数的 URL。render_template返回 200,其中 index.html 模板作为该 URL 上的内容返回。

更简单地说,请考虑一下 - 如果您没有呈现任何端点模板,并且所有重定向都指向应用中端点的 url,则不会有任何要呈现的内容!

这就像指出一个不会显示自己的地方的道路。

一个 URL 终结点可以具有许多不同的 render_template 语句,从而呈现模板文件夹中的不同页面模板。另一方面,使用重定向会更改 URL 本身,从而调用与该路由关联的方法。

重要的是一致性,请始终执行以下操作:

  • "GET"方法使用render_template("index.html")
  • "POST"方法使用重定向("/")

即使(在此示例中)两者都将显示相同的网页,但由于方法不同,其中的动态数据可能会有所不同。众所周知,GET就像在POST提交Web表单时单击网页上的超链接一样简单,这可能涉及数据计算并可能显示在最终网页中。

Miguel Grinberg(O'Reilly,2018)的"Flask Web Development"一书中的另一个支持推荐: 如果您提交表单(通过 POST 方法),如果用户刷新页面,则会弹出一个模糊的警告,要求在再次提交表单之前进行确认。发生这种情况是因为浏览器重复了最后一个请求,在本例中为 POST。因此,最好不要将 POST 请求作为浏览器发送的最后一个请求。"重定向"发出对重定向 URL 的 GET 请求,这就是它显示的页面。现在最后一个请求是 GET,因此刷新单击按预期工作,这种良好做法称为 POST/重定向/GET 模式。因此,始终对POST方法使用"重定向"。

使用redirect()重定向到传递的 URL 等效于从客户端(浏览器)传递对redirect()方法中传递的 URL 的GET请求,因此它会导致执行传递的 URL 的 "view" 函数,通常,最终我们有一个"return 语句", 通过render_template返回 Html 页面(模板),最终将 Html 页面传递给客户端浏览器。

render_template仅将 Html 页面及其所有其他参数传递给客户端浏览器,之后不会执行"view"函数。

最新更新