如何从Flask视图函数返回DataFrame至Python请求端
实现Flask视图返回DataFrame并被另一个Python应用接收的方案
由于Flask无法直接返回pandas DataFrame对象,我们需要先将DataFrame序列化为可通过HTTP传输的格式,再在接收端反序列化为DataFrame。以下是几种可行的实现方式:
方法一:使用JSON格式(推荐,安全且通用)
JSON是跨语言通用的序列化格式,适合大多数场景,且能较好保留DataFrame的结构信息。
Flask应用2的视图函数
from flask import Flask, Response import pandas as pd app = Flask(__name__) @app.route('/api/get-dataframe', methods=['POST']) def send_dataframe(): # 示例:生成你的DataFrame(替换为实际业务逻辑) df = pd.DataFrame({ 'id': [1, 2, 3], 'name': ['Alice', 'Bob', 'Charlie'], 'score': [85.5, 92.0, 78.3] }) # 将DataFrame转为JSON字符串,使用'split'格式保留列、索引和数据结构 df_json = df.to_json(orient='split') # 返回JSON响应,设置正确的Content-Type return Response(df_json, mimetype='application/json') if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
Python应用1的调用代码
import requests import pandas as pd url = 'http://localhost:5000/api/get-dataframe' myobj = {'request_param': 'some_value'} # 你的请求参数 # 发送POST请求 ret = requests.post(url, json=myobj) # 解析JSON字符串为DataFrame,注意orient参数要和发送端一致 received_df = pd.read_json(ret.text, orient='split') # 验证结果 print(received_df)
方法二:使用Pickle格式(仅适用于信任的内部服务)
Pickle是Python特有的序列化格式,能完整保留DataFrame的所有信息,但存在安全风险(可能执行恶意代码),仅适合完全信任的内部系统间通信。
Flask应用2的视图函数
from flask import Flask, Response import pandas as pd import pickle app = Flask(__name__) @app.route('/api/get-dataframe-pickle', methods=['POST']) def send_dataframe_pickle(): df = pd.DataFrame({ 'id': [1, 2, 3], 'name': ['Alice', 'Bob', 'Charlie'], 'score': [85.5, 92.0, 78.3] }) # 将DataFrame序列化为pickle字节流 df_pickle = pickle.dumps(df) # 返回二进制响应 return Response(df_pickle, mimetype='application/octet-stream') if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
Python应用1的调用代码
import requests import pickle url = 'http://localhost:5000/api/get-dataframe-pickle' myobj = {'request_param': 'some_value'} ret = requests.post(url, json=myobj) # 反序列化pickle字节流为DataFrame received_df = pickle.loads(ret.content) print(received_df)
注意事项
- 若使用JSON格式,
orient参数需在发送和接收端保持一致(常用的有split、records、index等,根据需求选择)。 - Pickle格式禁止用于处理不可信来源的请求,避免代码注入风险。
- 若DataFrame包含特殊数据类型(如datetime),JSON格式需要额外处理(可使用
date_format='iso'参数),而Pickle会自动保留类型信息。
内容的提问来源于stack exchange,提问作者questp
相关产品推荐
相关产品推荐

