python flask如何返回json数据_flask框架返回json格式响应的方法

冰火之心
发布: 2025-09-18 16:05:01
原创
877人浏览过
Flask中返回JSON数据首选jsonify函数,它自动设置Content-Type并转换Python对象为JSON格式;支持字典、列表等可序列化类型,建议始终返回字典结构以避免字符串被转为数组;可通过返回元组或使用make_response设置自定义状态码;处理如datetime等非序列化对象时需自定义JSONEncoder;也可用Response对象手动控制响应,但需自行序列化数据。

python flask如何返回json数据_flask框架返回json格式响应的方法

直接来说,在 Flask 中返回 JSON 数据非常简单,主要依赖

jsonify
登录后复制
函数。它能自动设置正确的
Content-Type
登录后复制
头部,并且处理 Python 对象到 JSON 格式的转换。

解决方案

最基础的用法是导入

jsonify
登录后复制
,然后将你的数据(字典、列表等)作为参数传递给它,最后从 Flask 路由函数中返回。例如:

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/api/data')
def get_data():
    data = {'message': 'Hello from Flask!', 'status': 'success'}
    return jsonify(data)

if __name__ == '__main__':
    app.run(debug=True)
登录后复制

这段代码创建了一个简单的 API 端点

/api/data
登录后复制
,当你访问这个端点时,你会得到一个包含
message
登录后复制
status
登录后复制
的 JSON 响应。

立即学习Python免费学习笔记(深入)”;

Flask 如何处理非字典类型的 JSON 数据?

jsonify
登录后复制
不仅能处理字典,还能处理列表和其他可序列化为 JSON 的 Python 对象。但如果你直接传递一个字符串给
jsonify
登录后复制
,Flask 会自动将其包装成一个 JSON 数组。为了避免这种行为,最好总是返回一个字典,即使你只想返回一个简单的值。例如:

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/api/message')
def get_message():
    message = "This is a simple message."
    return jsonify({'message': message}) # 始终返回一个字典

if __name__ == '__main__':
    app.run(debug=True)
登录后复制

如何自定义 JSON 响应的状态码

默认情况下,

jsonify
登录后复制
返回的状态码是 200 OK。但你可能需要根据不同的情况返回不同的状态码,例如 400 Bad Request 或 500 Internal Server Error。你可以通过在
jsonify
登录后复制
函数调用后链式调用
make_response
登录后复制
方法来实现。

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30
查看详情 Find JSON Path Online
from flask import Flask, jsonify, make_response

app = Flask(__name__)

@app.route('/api/error')
def handle_error():
    error_data = {'error': 'Something went wrong!'}
    response = jsonify(error_data)
    response.status_code = 500 # 设置状态码为 500
    return response

if __name__ == '__main__':
    app.run(debug=True)
登录后复制

更简洁的方式是直接返回一个元组,其中第一个元素是 JSON 数据,第二个元素是状态码:

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/api/error_simple')
def handle_error_simple():
    error_data = {'error': 'Another error occurred!'}
    return jsonify(error_data), 400 # 直接返回数据和状态码

if __name__ == '__main__':
    app.run(debug=True)
登录后复制

如何处理 JSON 序列化错误?

有时候,你的数据可能包含无法直接序列化为 JSON 的对象,例如 datetime 对象。在这种情况下,你需要自定义 JSON 编码器。Flask 允许你通过继承

json.JSONEncoder
登录后复制
类并重写
default
登录后复制
方法来实现这一点。

import json
from datetime import datetime
from flask import Flask, jsonify

class CustomJSONEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.isoformat() # 将 datetime 对象转换为 ISO 8601 字符串
        return super().default(obj)

app = Flask(__name__)
app.json_encoder = CustomJSONEncoder # 设置自定义 JSON 编码器

@app.route('/api/date')
def get_date():
    date_data = {'current_time': datetime.now()}
    return jsonify(date_data)

if __name__ == '__main__':
    app.run(debug=True)
登录后复制

这段代码定义了一个

CustomJSONEncoder
登录后复制
类,它会将
datetime
登录后复制
对象转换为 ISO 8601 格式的字符串。然后,我们将这个自定义编码器赋值给
app.json_encoder
登录后复制
,Flask 就会使用它来序列化 JSON 数据。

如何在 Flask 中使用

Response
登录后复制
对象返回 JSON?

虽然

jsonify
登录后复制
很方便,但有时你可能需要更细粒度的控制。这时,你可以直接使用 Flask 的
Response
登录后复制
对象。你需要手动将数据序列化为 JSON 字符串,并设置
Content-Type
登录后复制
头部。

import json
from flask import Flask, Response

app = Flask(__name__)

@app.route('/api/custom')
def get_custom_response():
    data = {'message': 'Custom response!'}
    json_data = json.dumps(data) # 手动序列化为 JSON 字符串
    return Response(json_data, mimetype='application/json') # 创建 Response 对象

if __name__ == '__main__':
    app.run(debug=True)
登录后复制

使用

Response
登录后复制
对象的好处是可以完全控制响应的各个方面,例如头部、状态码和内容类型。但是,你也需要自己处理 JSON 序列化,这可能会增加一些复杂性。

总的来说,

jsonify
登录后复制
是 Flask 中返回 JSON 数据的首选方式,因为它简单易用,并且能自动处理许多细节。但是,在需要更高级的控制时,
Response
登录后复制
对象也是一个强大的选择。

以上就是python flask如何返回json数据_flask框架返回json格式响应的方法的详细内容,更多请关注php中文网其它相关文章!

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号