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

Flask接收HTML表单数据返回None,请求排查问题原因

问题分析与解决方案

你的核心问题是表单提交的目标路由错误,导致处理POST请求的/form-entry路由根本没接收到表单数据,自然获取不到name值:

  1. 你的HTML表单里,action属性设置为{{ url_for('contact') }},这个路由对应的是只处理GET请求的contact函数,它不会处理POST提交的数据;而你写的处理POST数据的是/form-entry路由(对应receive_data函数)。
  2. 当表单提交到contact路由时,因为该路由未开启POST方法支持,Flask默认只处理GET请求,表单数据不会被解析,用request.form.get("name")会得到None,用request.form["name"]则会抛出KeyError,表现为Bad Request错误。

修复步骤

1. 修改HTML表单的action属性

将表单的action改为指向receive_data函数对应的路由:

<form name="sentMessage" id="contactForm" action="{{ url_for('receive_data') }}" method="post" novalidate>
  <!-- 表单其他内容保持不变 -->
</form>

2. 可选优化:合并路由(推荐)

如果希望/contact路由同时处理表单展示和提交,可以修改路由配置,让它支持POST方法,无需分开两个路由:

@app.route("/contact", methods=["GET", "POST"])
def contact():
    if request.method == "POST":
        name = request.form.get("name")
        return f"<h1>{name} Successfully sent your message</h1>"
    return render_template("contact.html")

这种情况下,HTML表单的action可以改为{{ url_for('contact') }}或者留空(默认提交到当前页面路由)。

额外注意事项

  • 确保表单的method属性是post,你的代码已正确设置。
  • 使用request.form.get("name")比直接用request.form["name"]更安全,前者在键不存在时返回None,不会直接抛出错误。

内容的提问来源于stack exchange,提问作者Dev Scratch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 17:10:24