如何在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
相关产品推荐
相关产品推荐

