You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flask API响应中同时返回JSON数据与CSV文件?

在Flask API中同时返回JSON响应和CSV文件的实现方法

要在Flask接口里同时返回JSON数据和CSV文件,有两种实用的实现方式,可根据你的需求选择:

方案一:将JSON数据放入响应头,主体返回CSV文件

这种方法适合JSON数据体量较小的场景,实现简单直接。思路是把JSON序列化为字符串后放到自定义HTTP响应头中,再返回CSV文件。

修改后的代码示例:

import json
from datetime import datetime
from flask import send_from_directory

@app.route('/idea123', methods=['POST','GET'])
def func123():
    try:
        DOWNLOAD_DIRECTORY = r'../../..'
        d1 = {}
        # 确保file变量已正确定义,abcd函数生成有效的CSV文件名
        result_file = abcd(file)
        d1['Status'] = 'Success'
        # 将datetime对象转为字符串,避免JSON序列化失败
        d1['Created_date'] = datetime.now().isoformat()
        
        # 生成文件响应,并在响应头中加入JSON元数据
        response = send_from_directory(DOWNLOAD_DIRECTORY, result_file)
        # 自定义响应头存放JSON数据,前端需读取该头获取信息
        response.headers['X-Response-Meta'] = json.dumps(d1)
        return response

    except Exception as e:
        print(e)
        d1 = {
            'Status': 'Failure',
            'Created_date': datetime.now().isoformat()
        }
        # 异常时返回JSON响应和500错误状态码
        return d1, 500

注意:HTTP响应头对内容长度有一定限制,若JSON数据过大,不建议使用此方案。

方案二:返回Multipart格式响应(同时包含JSON和CSV)

如果JSON数据量较大,或需要更规范地在单个响应中包含多份内容,可采用Multipart格式。这种方式需要手动构造响应内容,将JSON和CSV作为两个独立的部分封装。

修改后的代码示例:

import json
import os
from datetime import datetime
from flask import make_response

@app.route('/idea123', methods=['POST','GET'])
def func123():
    # 自定义分隔符,用于区分响应中的不同部分
    boundary = '----WebKitFormBoundary7MA4YWxkTrZu0gW'
    try:
        DOWNLOAD_DIRECTORY = r'../../..'
        d1 = {}
        result_file = abcd(file)
        d1['Status'] = 'Success'
        d1['Created_date'] = datetime.now().isoformat()
        
        # 读取CSV文件内容
        file_path = os.path.join(DOWNLOAD_DIRECTORY, result_file)
        with open(file_path, 'rb') as f:
            csv_content = f.read().decode('utf-8')  # 假设CSV采用UTF-8编码
        
        # 构造Multipart响应的各个部分
        response_parts = []
        # 添加JSON元数据部分
        response_parts.append(f'--{boundary}')
        response_parts.append('Content-Disposition: form-data; name="metadata"')
        response_parts.append('Content-Type: application/json')
        response_parts.append('')
        response_parts.append(json.dumps(d1))
        # 添加CSV文件部分
        response_parts.append(f'--{boundary}')
        response_parts.append(f'Content-Disposition: form-data; name="csv_file"; filename="{result_file}"')
        response_parts.append('Content-Type: text/csv')
        response_parts.append('')
        response_parts.append(csv_content)
        # 结束标记
        response_parts.append(f'--{boundary}--')
        
        # 拼接所有部分,生成响应内容
        response_content = '\r\n'.join(response_parts)
        response = make_response(response_content)
        # 设置响应的Content-Type为Multipart格式
        response.headers['Content-Type'] = f'multipart/form-data; boundary={boundary}'
        return response

    except Exception as e:
        print(e)
        d1 = {
            'Status': 'Failure',
            'Created_date': datetime.now().isoformat()
        }
        return d1, 500

这种方案需要前端解析Multipart响应,分别提取JSON和CSV内容,适合复杂场景下的需求。

内容的提问来源于stack exchange,提问作者Bhawna_priya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 22:52:43