
flask 路由返回 404 并非因 html 内容本身被拒绝,而是前端 ajax 配置不当(processdata: false + contenttype: false)导致 flask 无法正确解析表单数据,使 request.form 为空,进而逻辑判断失败。本文详解原因、修复方案及安全建议。
flask 路由返回 404 并非因 html 内容本身被拒绝,而是前端 ajax 配置不当(processdata: false + contenttype: false)导致 flask 无法正确解析表单数据,使 request.form 为空,进而逻辑判断失败。本文详解原因、修复方案及安全建议。
你遇到的现象——发送含 HTML 标签(如
)的 POST 请求时 Flask 返回 404,而纯文本正常——根本原因并非 Flask “拒绝 HTML” 或“不支持特殊字符”,而是请求未被正确识别为表单提交,导致 request.form 始终为空,从而 request.form.get('test') 为 None,函数执行 return "NO";但若路由未匹配或请求体解析异常,更常见的是前端配置错误引发后端无法读取数据,实际返回的是 "NO",而非真正的 HTTP 404 状态码(你截图中的 404 很可能源于浏览器开发者工具误判或前端重定向/资源加载失败,需以 Network 面板的 Response 和 Status Code 为准)。
? 根本问题:AJAX 配置禁用了表单序列化
你的 AJAX 设置:
processData: false, contentType: false
这两项组合完全绕过了 jQuery 对表单数据的自动序列化和 Content-Type 设置,导致:
- 数据以原始 JavaScript 对象形式发送(非 application/x-www-form-urlencoded);
- Flask 的 request.form 仅解析标准表单编码(application/x-www-form-urlencoded 或 multipart/form-data),对裸对象或 text/plain 类型无感知;
- 因此 request.form.get('test') 永远为 None,始终返回 "NO"。
✅ 正确做法:让 jQuery 自动处理表单数据(默认行为):
let datax = { test: '@@##@@' };
$.ajax({
url: '/apix',
type: 'POST',
data: datax, // ✅ 移除 processData & contentType —— 让 jQuery 自动序列化为 form-urlencoded
}).done(function(data) {
if (data === "OK") {
alert("OK");
} else {
alert("NO");
}
});
✅ 后端增强:兼容多种数据格式(推荐)
为提升健壮性,建议 Flask 端同时检查 request.form、request.json 和 request.values:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/apix', methods=["POST", "GET"])
def apix():
# 优先尝试 form 数据(传统表单)
test_val = request.form.get('test')
# 兜底:尝试 JSON(如前端用 JSON.stringify 发送)
if not test_val and request.is_json:
data = request.get_json()
test_val = data.get('test') if isinstance(data, dict) else None
# 最终兜底:检查所有参数(包括 query string + form)
if not test_val:
test_val = request.values.get('test')
if test_val is not None:
return "OK"
else:
return "NO", 400 # 显式返回 400 Bad Request,避免歧义
⚠️ 安全提醒:HTML 内容需谨慎处理
虽然技术上可传递 HTML 字符串,但直接渲染用户提交的 HTML 存在严重 XSS 风险。生产环境务必:
- 使用 html.escape() 转义输出(若需展示);
- 或借助 Markupsafe 进行安全渲染;
- 或采用富文本编辑器配套的白名单过滤库(如 bleach)。
示例(安全输出):
from markupsafe import escape
@app.route('/apix', methods=["POST"])
def apix():
test_val = request.form.get('test', '')
# 安全转义,防止 XSS
safe_output = escape(test_val)
return f"Received: {safe_output}"
✅ 验证步骤
- 清除 AJAX 中 processData 和 contentType 选项;
- 确保 Flask 端使用 request.form.get();
- 打开浏览器 Network 面板,查看 /apix 请求的 Request Payload(应为 test=%3Cimg+width%3D%22500px%22+src%3D%22image.png%22%3E)和 Response(明确显示 "OK");
- 避免依赖截图中的“404”字样——以实际 HTTP 状态码(200/400)和响应体为准。
遵循以上修正,含 HTML 的字符串将被正常接收与处理,且兼顾安全性与兼容性。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











