Flask本身不强制REST风格,但搭建轻量级REST API最直接;关键在正确使用jsonify(自动设Content-Type和状态码)、显式声明methods、用request.get_json()读取JSON数据、禁用debug=True于生产环境。

Flask 本身不强制 REST 风格,但用它搭轻量级 REST API 是最直接、干扰最少的路径——不需要额外框架也能跑通标准 CRUD,关键在于怎么组织路由、处理请求体和返回结构。
用 jsonify 而不是 return dict
直接 return {"data": [...]} 看似能工作,但会触发 Flask 默认的 text/html 响应头,前端 fetch 或 axios 可能解析失败或静默出错。jsonify 不仅序列化字典,还自动设置 Content-Type: application/json 和状态码(默认 200)。
常见错误现象:Response is not JSON、Unexpected token <(实际返回了 HTML 错误页)。
- 正确写法:
return jsonify({"code": 200, "data": users}) - 错误写法:
return {"code": 200, "data": users}(缺jsonify,响应头错) - 注意:
jsonify不接受非字典/列表类型(如None或自定义对象),需先转成可序列化结构
@app.route 中必须显式声明 methods
Flask 默认只响应 GET 请求。如果你写了 @app.route('/users', methods=['POST']) 却漏掉 methods 参数,POST 请求会直接 405 Method Not Allowed,而不是进函数报错。
使用场景:前后端分离时,前端发 fetch('/users', {method: 'POST'}),后端没配 methods=['POST'] 就卡死。
立即学习“Python免费学习笔记(深入)”;
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
- 单方法路由:
@app.route('/users/<user_id>', methods=['GET'])</user_id> - 多方法共用一个函数(少见但可行):
@app.route('/users', methods=['GET', 'POST']),内部用request.method == 'POST'分支处理 - 别依赖
debug=True掩盖这个问题——它不会让未声明的 method 自动生效
从 request.get_json() 读取 POST/PUT 数据,而非 request.form
REST API 默认走 JSON body,不是表单编码(application/x-www-form-urlencoded)。用 request.form 会读不到数据,返回空 ImmutableMultiDict([])。
常见错误现象:前端发 { "name": "Alice" },后端打印 request.form 是空,request.get_json() 却是 None——那大概率是前端没设 Content-Type: application/json 或发了字符串而非对象。
- 安全写法:
data = request.get_json() or {}(避免None导致 KeyError) - 校验建议:
if not data or 'name' not in data:+ 返回 400 - 不用
request.json(已弃用,Flask 2.3+ 报警告)
调试阶段开 debug=True,但别在生产环境用 app.run()
app.run(debug=True) 启动的是 Werkzeug 内置开发服务器,它支持代码热重载、交互式调试器(点击错误页可执行语句),但完全不抗并发,也不支持 HTTPS、反向代理等生产要素。
容易踩的坑:有人把 app.run(debug=True, host='0.0.0.0') 直接扔到云服务器上跑,结果被扫描暴露调试器,导致任意代码执行。
- 开发时放心用:
app.run(debug=True, port=5001) - 生产部署必须换 WSGI 服务器:
gunicorn myapi:app或uvicorn myapi:app(后者需pip install uvicorn) -
debug=True会禁用所有 Flask 的安全头(如X-Content-Type-Options),仅限本地
jsonify 包、或者生产误用 app.run ——这些点不解决,API 表面能跑,实则不可靠、难调试、不安全。

















