【发布时间】:2017-11-02 21:25:23
【问题描述】:
我有一个使用 xlsxwriter 创建报告的函数视图,它是使用 StringIO 作为缓冲区动态创建的,最后通过 HttpResponse 发送。
使用本地服务器效果很好。
问题在于,在 Heroku 上,几秒钟后(文档提到 30 秒超时且不可修改),服务器挂起并重新启动 Web 进程,并给出错误作为响应。
最好的方法是什么?:
- 在内存中动态(动态)创建一个 xmlx 文件
- 将整个文件提供给客户端。
- 防止服务器因为长时间运行而挂起
这是我正在使用的一段代码:
def reporte_usuarios(request):
from xlsxwriter.workbook import Workbook
try:
import cStringIO as StringIO
except ImportError:
import StringIO
# create a workbook in memory
output = StringIO.StringIO()
workbook = Workbook(output)
bold = workbook.add_format({'bold': True})
# get the data
from django.db.models import Count
usuarios = User.objects.filter(....... # all filter stuff
for usr in usuarios:
if usr.activos > 0:
# create a workbook sheet every User registered
ws = workbook.add_worksheet(u'%s' % usr.username)
# some relevant user data
ws.write(1, 1, u'USUARIO: %s' % usr.username)
...
# get rows for user
log = LogActivos.objects.filter(usuario=usr).select_related('activo__unidad__id', 'activo__unidad__nombre', 'activo__nombre')
# write headers
ws.write(3, 0, u'FECHA', bold)
...
sig_fila = 4 #starting row for data (after headers)
for l in log:
# write all data
ws.write(sig_fila, 0, u'%s' % l.fecha)
...
sig_fila += 1
# close the workbook
workbook.close()
# go to the beginning of the buffer
output.seek(0)
# response using the buffer
response = HttpResponse(output.read(), content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response['Content-Disposition'] = 'attachment; filename="ACTIVOS_USUARIOS__%s.xlsx"' % datetime.now().strftime("%Y%m%d_%H%M")
return response
注意:我在 Heroku、django 1.9.13 和 python 2.7.11 上使用 Gunicorn
【问题讨论】:
标签: python django heroku large-data