Как устранить неисправность поврежденного возврата BytesIO в django? - PullRequest
2 голосов
/ 27 января 2020

У меня странная проблема, возникающая в django, и я не уверен, как вообще начать ее устранять. Я использую xlsxwriter для создания отчета Excel из некоторых данных. Затем я хочу передать сгенерированный файл пользователю. Мой код вида выглядит так:

today = datetime.datetime.now()
document = gen_excel(today)
filename = 'export_{}.xlsx'.format(today.strftime('%Y-%m-%d'))
response = HttpResponse(
    document.read(),
    content_type='application/ms-excel'
)
response['Content-Disposition'] = 'attachment; filename=%s' % filename

return response

, а функция gen_excel выглядит следующим образом:

def gen_excel(start_date):
    output = io.BytesIO()
    workbook = xlsxwriter.Workbook(output, {'in_memory': True})

    create_sheets(start_date, workbook) # Creates and fills worksheets with data

    workbook.close()
    output.seek(0)

    return output

Итак, с gen_excel я возвращаю поток bytesIO, который был заполнен xlsxwriter. Моя проблема в том, что (при использовании встроенного сервера dev) при первом вызове представления я получаю отлично читаемый файл xlsx. Все последующие вызовы возвращают поврежденный файл xlsx, который может быть отремонтирован Excel (хотя это убивает все форматирование и т. Д. c ..). Если я смотрю размеры файлов, первый вывод составляет 40655 байт, тогда как последующие загрузки немного меньше и составляют 40336 байт.

Кикер, после перезапуска сервера первый вывод снова становится идеальным. Поэтому моя функция gen_excel не изменяет данные на сервере - похоже, это связано с последующими загрузками после запуска сервера. Также нет ошибок, выводимых django, xlsxwriter, сервером и т. Д. c. Я просто получаю испорченный файл для всех последующих загрузок, пока сервер не будет перезагружен.

Есть идеи, как мне начать устранение неполадок с этим?

...