Flask 设置返回 JSON 的完整指南
在 Flask 框架中,返回 JSON 数据是构建 API 服务的常见需求,本文将详细介绍 Flask 中设置返回 JSON 的多种方法,从基础到进阶,帮助你灵活应对不同的开发场景。
使用 jsonify 函数返回 JSON
Flask 提供了 jsonify 函数,这是最简单直接的返回 JSON 数据的方式。jsonify 会自动将 Python 字典转换为 JSON 格式,并设置正确的 Content-Type 头部为 application/json。
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/api/user')
def get_user():
user_data = {
'id': 1,
'name': '张三',
'email': 'zhangsan@example.com'
}
return jsonify(user_data)
jsonify 的特点:
- 自动将 Python 字典/列表转换为 JSON 字符串
- 自动设置 Content-Type 为 application/json
- 处理了 JSON 的特殊字符(如 <, >, & 等)
- 支持 HTTP 状态码设置
使用 Flask Response 对象返回 JSON
除了 jsonify,你也可以直接使用 Flask 的 Response 类来返回 JSON 数据,这种方式更灵活,可以自定义更多响应细节。
from flask import Flask, Response
import json
app = Flask(__name__)
@app.route('/api/product')
def get_product():
product_data = {
'id': 101,
'name': '笔记本电脑',
'price': 5999
}
response = Response(
response=json.dumps(product_data),
status=200,
mimetype='application/json'
)
return response
Response 方式的优势:
- 可以完全控制响应的各个部分(状态码、头部、内容)
- 适用于需要返回非 JSON 数据但偶尔需要 JSON 的场景
- 可以自定义 JSON 序列化器
处理 JSON 序列化问题
当数据中包含不可 JSON 序列化的对象(如 datetime 对象)时,直接使用 jsonify 或 json.dumps 会出错,这时需要自定义序列化器。
from flask import Flask, jsonify
from datetime import datetime
app = Flask(__name__)
def json_serializer(obj):
if isinstance(obj, datetime):
return obj.isoformat()
raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
@app.route('/api/log')
def get_log():
log_data = {
'id': 1,
'timestamp': datetime.now(),
'message': '系统启动'
}
return jsonify(log_data, default=json_serializer)
使用 Flask-RESTful 扩展
对于复杂的 API 项目,可以使用 Flask-RESTful 扩展,它提供了更强大的 JSON 处理能力。
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class UserResource(Resource):
def get(self):
return {
'id': 1,
'name': '李四',
'email': 'lisi@example.com'
}
api.add_resource(UserResource, '/api/user')
全局 JSON 配置
Flask 允许你全局配置 JSON 的处理方式,例如设置 JSON 的排序规则。
app = Flask(__name__) app.config['JSON_SORT_KEYS'] = False # 保持字典键的原始顺序
处理 JSONP 请求
对于需要支持 JSONP 的场景,可以检查查询参数并返回相应的 JSONP 响应。
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/api/data')
def get_data():
data = {'message': 'Hello, World!'}
callback = request.args.get('callback')
if callback:
return f"{callback}({jsonify(data).data.decode('utf-8')})"
return jsonify(data)
性能优化建议
- 对于大量数据的 JSON 序列化,考虑使用
orjson或ujson等更快的 JSON 库 - 避免在循环中进行 JSON 序列化,尽量一次性序列化整个数据结构
- 对于频繁访问的 API 响应,可以考虑缓存已序列化的 JSON
Flask 提供了多种返回 JSON 的方式,从简单的 jsonify 到灵活的 Response 对象,再到功能丰富的 Flask-RESTful 扩展,选择哪种方式取决于你的具体需求:
- 简单 API:直接使用
jsonify - 需要自定义响应:使用
Response对象 - 复杂 API 项目:考虑 Flask-RESTful
- 特殊序列化需求:自定义序列化器
这些方法后,你就可以在 Flask 应用中灵活地处理 JSON 数据了。



还没有评论,来说两句吧...