我有一个烧瓶应用程序运行查询并返回一个表。我想在页面上提供一个按钮,以便用户可以将数据导出为csv。
问题是查询是根据表单输入动态生成的。
@app.route('/report/<int:account_id>', methods=['GET'])
def report(account_id):
if request == 'GET':
c = g.db.cursor()
c.execute('SELECT * FROM TABLE WHERE account_id = :account_id', account_id=account_id)
entries = [dict(title=row[0], text=row[1]) for row in c.fetchall()]
return render_template('show_results.html', entries=entries)
在HTML方面,它只是一个简单的表,循环遍历行并呈现它们。我使用bootstrap进行样式化,并包含了tablesorter jquery插件。这些都不是真正重要的。我确实尝试过一个我发现的javascript导出器,但由于我的内容是动态呈现的,因此会保存一个空白的CSV。
我是否需要做一些ajax风格的技巧来从路线中获取csv对象?
答案 0 :(得分:0)
import cx_Oracle # We are an Oracle shop, and this changes some things
import csv
import StringIO # allows you to store response object in memory instead of on disk
from flask import Flask, make_response # Necessary imports, should be obvious
@app.route('/export/<int:identifier>', methods=['GET'])
def export(load_file_id):
si = StringIO.StringIO()
cw = csv.writer(si)
c = g.db.cursor()
c.execute('SELECT * FROM TABLE WHERE column_val = :identifier', identifier=identifier)
rows = c.fetchall()
cw.writerow([i[0] for i in c.description])
cw.writerows(rows)
response = make_response(si.getvalue())
response.headers['Content-Disposition'] = 'attachment; filename=report.csv'
response.headers["Content-type"] = "text/csv"
return response