form标签必须设置action和method属性:不填action会导致页面刷新并跳转至当前url,后端收不到数据;不写method则默认get,致数据暴露、长度受限、无法提交文件或敏感字段。

form 标签必须设置 action 和 method 属性
不填 action,点击提交后页面会刷新并跳转到当前 URL(即空提交),后端收不到任何数据;不写 method,浏览器默认用 GET,导致数据暴露在地址栏、有长度限制、无法提交文件或敏感字段。
生产环境几乎都该用 POST:
-
action必须指向一个真实可接收请求的后端路径,比如/api/submit或/contact -
method="post"是安全底线,尤其含密码、邮箱、长文本时 - 若用 Django/Flask 等框架,
action值要和路由定义严格一致,大小写、斜杠都不能错
每个 input 都得有 name 属性,否则数据不会发出去
浏览器只序列化带 name 的控件。没写 name 的 <input type="text">,哪怕用户输了 100 个字,后端 request.form 或 $_POST 里也完全找不到它。
常见错误示例:
<input type="text" placeholder="用户名"><!-- ❌ 没 name,白输 -->
正确写法:
<input type="text" name="username" required>
其他要点:
- 多个同名
checkbox会以数组形式提交,如hobby=阅读&hobby=编程 -
radio组必须共用一个name,靠value区分选项 -
select的name决定后端取值键名,不是option的文本内容
前端验证只是辅助,后端校验不可省略
required、type="email"、minlength 这些属性能拦截明显错误,但绕过太容易:禁用 JS、手动改 HTML、用 curl 直接 POST,都能跳过。
所以:
- 别依赖
required防止空提交——后端必须检查字段是否存在、是否为空字符串 -
type="email"不代表邮箱格式真合法,仅防随手乱输;后端仍需正则或库校验(如 Python 的email-validator) - 敏感字段如密码,前端不校验长度也无妨,但后端必须设上限(防 DoS)和下限(防弱口令)
Django 场景下漏掉 {% csrf_token %} 会直接 403
这是新手最常卡住的一点:表单能渲染、能点击、能发请求,但后端返回 403 Forbidden,控制台看不出错,网络面板看到状态码就停了。
根本原因是 Django 默认开启 CSRF 中间件,所有 POST 请求必须携带有效 token。
修复方式只有一种:
注意:
-
{% csrf_token %}必须放在<form></form>内部,且不能被 JS 动态移除 - 如果用 AJAX 提交,需从
document.querySelector('[name=csrfmiddlewaretoken]')或响应头中提取 token 并附在请求头里 - 单独测试时可临时关掉
django.middleware.csrf.CsrfViewMiddleware,但上线前务必打开
表单看着简单,真正跑通的关键往往藏在 name、csrf_token、后端字段键名这三处匹配上——少一个,数据就断在半路。










