为何redirect命令会将POST转为GET?Flask路由相关疑问解析
问题与代码
代码片段
25 @app.route("/", methods=["GET", "POST"]) 26 def index(): 27 if request.method == "POST": 28 29 # TODO: Add the user's entry into the database 30 31 return redirect("/") 32 33 else: 34 35 # TODO: Display the entries in the database on index.html 36 37 return render_template("index.html", birthdays)
疑问
redirect("/")是否意味着回到第25行的路由?为何这不会造成无限循环?- 执行
redirect()后请求方法似乎会变为GET,是否确实如此? - 为何redirect命令会将POST方法转为GET?
解答
redirect("/")指向的路由及无循环原因
没错,redirect("/")就是让浏览器重新请求第25行定义的根路由/。不会触发无限循环是因为:当前是在处理POST请求时执行的redirect,浏览器收到重定向响应后,会发送一个全新的GET请求到/,此时进入index函数会走else分支(因为请求方法是GET),不会再触发POST分支里的redirect,自然不会循环。执行
redirect()后请求方法是否变为GET
确实是这样。浏览器接收到重定向响应后,会自动发起GET请求到目标地址,原有的POST方法不会被保留。为何
redirect会将POST转为GET
这是HTTP协议的规定:Flask的redirect默认返回302状态码(临时重定向),根据协议规范,浏览器处理POST请求得到的3xx重定向响应时,会自动改用GET方法请求目标地址。这是Web开发里的Post/Redirect/Get(PRG)模式,核心作用是防止表单重复提交——用户刷新页面时,只会触发GET请求,不会重复执行POST对应的数据库插入操作,避免数据重复。
内容的提问来源于stack exchange,提问作者parmer_110
相关产品推荐
相关产品推荐

