我试图允许用户下载一个CSV文件,其中的数据由他们的操作定义。该文件不存在,它是动态创建的。我如何在 flask 中做到这一点?
oxcyiej71#
使用csv.writer和stream the response生成数据。使用StringIO写入内存缓冲区,而不是生成中间文件。
csv.writer
import csv from datetime import datetime from io import StringIO from flask import Flask from werkzeug.wrappers import Response app = Flask(__name__) # example data, this could come from wherever you are storing logs log = [ ('login', datetime(2015, 1, 10, 5, 30)), ('deposit', datetime(2015, 1, 10, 5, 35)), ('order', datetime(2015, 1, 10, 5, 50)), ('withdraw', datetime(2015, 1, 10, 6, 10)), ('logout', datetime(2015, 1, 10, 6, 15)) ] @app.route('/') def download_log(): def generate(): data = StringIO() w = csv.writer(data) # write header w.writerow(('action', 'timestamp')) yield data.getvalue() data.seek(0) data.truncate(0) # write each log item for item in log: w.writerow(( item[0], item[1].isoformat() # format datetime as string )) yield data.getvalue() data.seek(0) data.truncate(0) # stream the response as the data is generated response = Response(generate(), mimetype='text/csv') # add a filename response.headers.set("Content-Disposition", "attachment", filename="log.csv") return response
如果generate函数需要当前request中的信息,那么它应该用stream_with_context修饰,否则你会得到一个“working outside request context”的错误,其他的一切保持不变。
generate
request
stream_with_context
from flask import stream_with context @stream_with_context def generate(): ...
nue99wik2#
Flask-Excel库使用PyExcel生成CSV或其他电子表格格式,并生成Flask响应。文档列出了如何生成其他格式以及可以使用哪些数据的完整API。
pip install flask-excel
import flask_excel as excel @app.route('/download', methods=['GET']) def download_data(): sample_data=[0, 1, 2] excel.init_excel(app) extension_type = "csv" filename = "test123" + "." extension_type d = {'colName': sample_data} return excel.make_response_from_dict(d, file_type=extension_type, file_name=filename)
cclgggtu3#
# imports import os from flask import Flask, abort, send_file from Sisdoc import Sisdoc import socket import pandas as pd app = Flask(__name__) PATH = os.path.commonpath([os.path.dirname(__file__), os.path.dirname(__file__) + '/..']) FILE= os.path.join(PATH, 'sisdoc.csv') @app.get('/') def sisdoc(): sisdoc = Sisdoc() data = sisdoc.get_sisdoc() # Put your data here df = pd.DataFrame(data) df.columns = ['sisdoc', 'data', 'hora', 'tipo', 'status', 'descricao'] # Put your columns name here df.to_csv('sisdoc.csv', sep=';', index=False, encoding='utf-8-sig') try: return send_file(FILE, as_attachment=True) except FileNotFoundError: abort(404) if __name__ == '__main__': app.run()
3条答案
按热度按时间oxcyiej71#
使用
csv.writer
和stream the response生成数据。使用StringIO写入内存缓冲区,而不是生成中间文件。如果
generate
函数需要当前request
中的信息,那么它应该用stream_with_context
修饰,否则你会得到一个“working outside request context”的错误,其他的一切保持不变。nue99wik2#
Flask-Excel库使用PyExcel生成CSV或其他电子表格格式,并生成Flask响应。文档列出了如何生成其他格式以及可以使用哪些数据的完整API。
cclgggtu3#