发送excel文件下载GAE python

我正在使用Python App Engine和Python 2.7。 并且需要生成内存中的xls文件并将其发送给用户进行下载。

我在网上发现了大量的主题,但其中的任何一个都不能帮助我。 相关主题,我试图使用:1) 这是与Blobs,我第一次尝试 ,2) 没有Blob ,3) 与强制下载MIMEtypes ,也试图使用googlecloudstorage(无法find链接到主题)。

这是我的代码:

import StringIO class ExcelHandler(BaseHandler): def post(self): """Save members to excel document and send to user""" sheet = pyexcel.Sheet([[1, 2], [3, 4]]) filesheet = StringIO.StringIO() sheet.save_to_memory('xls', filesheet) filesheet.close() self.response.write(sheet) self.response.headers['Content-Type'] = 'application/force-download' self.response.headers['Content-Transfer-Encoding'] = 'utf-8' self.response.headers['Content-Disposition'] = 'attachment; filename=test.xlsx' 

问题在于发送响应(而不是在创build文件)。 我尝试了不同的“Content-Type”:application / vnd.ms-excel,application / download,application / force-download,application / octet-stream,application / vnd.openxmlformats – officedocument。 spreadsheetml.sheet”

但是,我所取得的最佳回应如图所示:

我不能强制我的浏览器开始从服务器上下载数据。 我想可能有一些东西在我的请求,应该说服务器'嘿,我想下载',但这只是我的想法,我还没有find任何关于这一点。 将感谢任何帮助!

这也是我的要求:

 POST /reg/excel HTTP/1.1 Host: 0.0.0.0:8080 Connection: keep-alive Content-Length: 0 Accept: */* Origin: http://0.0.0.0:8080 X-Requested-With: XMLHttpRequest User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 Referer: http://0.0.0.0:8080/competition?dbKey=agpkZXZ- dG1tb3NjchgLEgtDb21wZXRpdGlvbhiAgICAgICgCww Accept-Encoding: gzip, deflate Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 

和debugging器响应:

 HTTP/1.1 200 OK content-disposition: attachment; filename=test.xlsx content-transfer-encoding: utf-8 cache-control: no-cache content-type: application/force-download Content-Length: 64 Server: Development/2.0 Date: Sun, 02 Oct 2016 15:36:20 GMT 

编辑1 🙁尝试通过voscausa回答)

响应改变了它的格式。我将尝试写另一个数据结构(不是工作表)来响应

尝试这个:

 output = StringIO.StringIO() ....... self.response.headers[b'Content-Type'] = b'application/vnd.ms-excel; charset=utf-8' self.response.headers[b'Content-Disposition'] = b'attachment; filename=test.xlsx' self.response.write(output.getvalue())