我们需要从运行在Heroku上的Django管理员导出包含模型数据的csv文件.因此,我们创建了一个操作,我们在其中创建了csv并在响应中返回了它.这工作正常,直到我们的客户端开始导出大量数据,我们遇到了Web worker的30秒超时.
为了避免这个问题,我们考虑将csv流式传输到客户端,而不是先在内存中构建它并将其一起发送.Trigger是这条信息:
Cedar支持长轮询和流式响应.您的应用程序有一个最初的30秒窗口,以单个字节响应客户端.发送每个字节后(从客户端收到或由您的应用程序发送),您重置一个滚动的55秒窗口.如果在55秒窗口期间没有发送数据,则终止连接.
因此,我们实现了一些看起来像这样的东西来测试它:
import cStringIO as StringIO
import csv, time
def csv(request):
csvfile = StringIO.StringIO()
csvwriter = csv.writer(csvfile)
def read_and_flush():
csvfile.seek(0)
data = csvfile.read()
csvfile.seek(0)
csvfile.truncate()
return data
def data():
for i in xrange(100000):
csvwriter.writerow([i,"a","b","c"])
time.sleep(1)
data = read_and_flush()
yield data
response = HttpResponse(data(), mimetype="text/csv")
response["Content-Disposition"] = "attachment; filename=test.csv"
return response
Run Code Online (Sandbox Code Playgroud)
下载的HTTP标头如下所示(来自FireBug):
HTTP/1.1 200 OK
Cache-Control: max-age=0
Content-Disposition: attachment; filename=jobentity-job2.csv
Content-Type: text/csv
Date: Tue, 27 Nov 2012 13:56:42 GMT
Expires: Tue, 27 Nov 2012 13:56:41 GMT
Last-Modified: Tue, …
Run Code Online (Sandbox Code Playgroud)