Flask API端点需显式声明methods(如@app.route("/api/user", methods=["POST"])),严格校验Content-Type: application/json才能解析request.json,统一用jsonify()返回JSON并显式设状态码,调试应使用curl/httpie而非浏览器。

怎么用 Flask 写一个能被前端调用的 API 端点
直接定义 @app.route 装饰器 + 显式声明 methods,别依赖默认行为。Flask 默认只响应 GET,但真实 API 多数要处理 POST、PUT,漏写 methods 会导致 405 错误。
常见错误现象:curl -X POST http://127.0.0.1:5000/api/user 返回 405 Method Not Allowed
- 必须显式写
@app.route("/api/user", methods=["POST"]),哪怕只支持一个方法 - 如果要同时支持多个方法,写成
methods=["GET", "POST"],不要用字符串拼接或逗号分隔 - 路径末尾斜杠影响路由匹配:
/api/user和/api/user/是两个不同端点,别混用
request.json 为什么是 None?请求体解析失败的典型原因
request.json 为 None 不代表没传数据,而是 Flask 拒绝解析——它严格校验 Content-Type: application/json。前端发请求时漏设 header 或用了 text/plain,就会静默失败。
使用场景:用 fetch 或 axios 调用 Flask 接口时最常踩这个坑
立即学习“Python免费学习笔记(深入)”;
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 前端必须设置
headers: {"Content-Type": "application/json"} - 后端别依赖
request.json做空判断,先检查request.is_json,再取值 - 若需兼容表单提交(
application/x-www-form-urlencoded),改用request.form.get("key"),和 JSON 解析互不兼容
怎么返回标准 JSON 响应?别直接 return dict
Flask 允许直接 return {"msg": "ok"},但这会隐式调用 jsonify(),且默认状态码是 200。实际开发中,错误响应、自定义状态码、头部字段都得显式控制,否则前端难处理。
性能影响:频繁调用 jsonify() 开销极小,但隐式转换会让状态码、MIME 类型不可控
- 统一用
jsonify():return jsonify({"error": "not found"}), 404 - 需要加 header(比如 CORS)时,必须构造
Response对象,不能只靠jsonify() - 别在 JSON 中返回未序列化的对象(如数据库模型实例),会抛
TypeError: Object of type User is not JSON serializable
开发时怎么快速调试 API 请求流程?绕过浏览器缓存和预检
用浏览器地址栏直接访问 API 端点,本质是 GET 请求,且带缓存、无自定义 header,根本测不了真实交互逻辑。真正在意的是请求进来后,Flask 怎么一步步拿到数据、怎么走到你的函数里。
容易被忽略的地方:CORS 预检(OPTIONS)请求不会触发你的视图函数,但会走 Flask 的错误处理器;开发阶段不配 flask-cors 就直接被拦截,连日志都看不到
- 调试一律用
curl或httpie,例如:http POST :5000/api/login username=test password=123 - 在视图函数开头加
print(request.headers)和print(request.get_data()),确认原始输入 - 启用
app.config["DEBUG"] = True后,所有未捕获异常会输出完整 traceback,但生产环境必须关掉

















