Python 在App Engine上为用户生成的csv文件创建下载链接

Python 在App Engine上为用户生成的csv文件创建下载链接,python,google-app-engine,download,Python,Google App Engine,Download,我在尝试创建一个下载链接时遇到了一个问题,该链接将(1)原位生成一个CSV文件,(2)自动开始下载,而无需重定向到另一个页面(即AJAX请求) 发生的情况如下:我没有看到任何JavaScript错误,处理程序CSVDownload也在执行时没有任何问题。但是,下载从未开始。出于某种原因,如果我只输入URL(…网站../csvdownload),那么它确实会使用相同的处理程序创建文件。你知道为什么会这样吗 任何帮助都将不胜感激 HTML <button id="mainReportDownl

我在尝试创建一个下载链接时遇到了一个问题,该链接将(1)原位生成一个CSV文件,(2)自动开始下载,而无需重定向到另一个页面(即AJAX请求)

发生的情况如下:我没有看到任何JavaScript错误,处理程序CSVDownload也在执行时没有任何问题。但是,下载从未开始。出于某种原因,如果我只输入URL(…网站../csvdownload),那么它确实会使用相同的处理程序创建文件。你知道为什么会这样吗

任何帮助都将不胜感激

HTML

<button id="mainReportDownload" type="button">
   Download Report
</button>
Python

def List2CSV(data):
  csv = ""
  for row in data:
    for item in row:
      csv = csv + item + ','
    csv = csv[:-1] + '\n'
  csv = csv[:-1]
  return csv

class CSVDownload(webapp2.RequestHandler):
  def get(self):

    conn = rdbms.connect(instance=_INSTANCE_NAME, database='test')
    cursor = conn.cursor()

    cursor.execute('SELECT email FROM Test LIMIT 100')
    testvalues = [[item for item in row] for row in cursor.fetchall()]
    csv = List2CSV(testvalues)

    self.response.headers['Content-Type'] = 'text/csv'
    self.response.headers['Content-Disposition'] = 'attachment; filename=report.csv'
    self.response.out.write(csv)
    conn.close()

你有相互矛盾的要求。当浏览器导航到发送回“附件”内容处置的URL时,会发生正常下载。但是您正在尝试使用Ajax,它不导航,因此不进行下载。Ajax很乐意阅读内容,但随后简单地将其丢弃,因为您没有定义一个成功处理程序来告诉它如何处理它。当然,即使您定义了该处理程序,出于明显的安全原因,Javascript也无法将文件保存到用户的计算机上。

谢谢!只是创建了一个
链接,完全跳过了AJAX,它工作起来很有魅力。
def List2CSV(data):
  csv = ""
  for row in data:
    for item in row:
      csv = csv + item + ','
    csv = csv[:-1] + '\n'
  csv = csv[:-1]
  return csv

class CSVDownload(webapp2.RequestHandler):
  def get(self):

    conn = rdbms.connect(instance=_INSTANCE_NAME, database='test')
    cursor = conn.cursor()

    cursor.execute('SELECT email FROM Test LIMIT 100')
    testvalues = [[item for item in row] for row in cursor.fetchall()]
    csv = List2CSV(testvalues)

    self.response.headers['Content-Type'] = 'text/csv'
    self.response.headers['Content-Disposition'] = 'attachment; filename=report.csv'
    self.response.out.write(csv)
    conn.close()