You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

提交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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 12:40:13