提交POST表单后刷新页面,如何让请求方法恢复为默认GET?
解决Flask表单POST提交后刷新仍保持POST请求的问题
问题原因
当你提交POST表单后,后端直接返回render_template,此时浏览器的历史记录中保存的是POST请求。刷新页面时,浏览器会重复发送最后一次的POST请求,导致request.method始终为POST,继续返回xvalue=2的结果。
解决方案:采用PRG模式(Post/Redirect/Get)
处理POST请求后,不要直接返回模板,而是通过redirect重定向到GET请求的/login路由。这样浏览器会发送GET请求,刷新时也只会重复GET请求,恢复默认的请求方法。
修改后端代码
from flask import redirect, url_for @app.route("/login", methods=["GET", "POST"]) def login(): if request.method == "POST": if not request.form.get("username"): # 重定向到login的GET请求 return redirect(url_for("login")) else: # 此处可添加登录成功后的逻辑,比如跳转首页 return redirect(url_for("login")) # GET请求时返回模板 return render_template("login.html", xvalue=4)
保留错误提示(可选)
如果需要提示用户“用户名不能为空”这类信息,可以用Flask的flash功能传递消息,在模板中显示:
后端代码调整
from flask import flash, redirect, url_for, render_template, request @app.route("/login", methods=["GET", "POST"]) def login(): if request.method == "POST": if not request.form.get("username"): flash("用户名不能为空") return redirect(url_for("login")) else: flash("登录验证成功") return redirect(url_for("login")) return render_template("login.html", xvalue=4)
模板添加消息显示
修改login.html,在表单上方添加flash消息展示区域:
{% with messages = get_flashed_messages() %} {% if messages %} {% for message in messages %} <div class="alert">{{ message }}</div> {% endfor %} {% endif %} {% endwith %} <form action="/login" method="post" name="login" id="login"> <input autocomplete="off" id="username" name="username" value="{{ hold }}" type="text"> <input id="password" name="password" type="password"> <button type="submit">Log In</button> </form>
这样处理后,POST提交后浏览器会重定向到GET请求的/login页面,刷新时就会触发GET请求逻辑,返回xvalue=4的结果。
内容的提问来源于stack exchange,提问作者parmer_110
相关产品推荐
相关产品推荐

