Генерация PDF-файла Weasyprint слишком долгая, что делает загрузку невозможной. Как транслировать его создание?

Я успешно использую Weasyprint для создания pdf, пока не достигну определенного размера, распространенного варианта использования моего приложения, когда генерация pdf занимает так много времени (более 10 с), что прерывает соединение с браузером и скачивание невозможно.

Я полагаю, я должен передать создание файла и вернуть django StreamingHttpResponse (согласны?). Я не стал бы предварительно обрабатывать PDF-файл, потому что он состоит из корзин с элементами, которые пользователи часто добавляют или удаляют.

Но как я могу создать поток создания файла с помощью weasyprint ? Даже если я разрежу свою строку sourceHtml по частям, как написать pdf шаг за шагом?

Я визуализирую шаблон django и генерирую из него PDF:

from weasyprint import HTML

sourceHtml = template.render(my-objects)
outhtml = HTML(string=sourceHtml).write_pdf()

response = HttpResponse(outhtml, content_type='application/pdf')
response['Content-Disposition'] = u'attachment; filename="{}.pdf"'.format(name)

Или есть другой способ решить эту проблему?

Спасибо !


person Ehvince    schedule 18.01.2017    source источник
comment
Браузер может ждать ответа без ограничения времени. Если ваше соединение разрывается, это означает, что тайм-аут установлен где-то на вашем веб-сервере или обратном прокси-сервере. Просто найдите, где он находится, и увеличьте его.   -  person Yaroslav Stavnichiy    schedule 19.01.2017
comment
@YaroslavStavnichiy, который может не исправить pb, но может заставить работать больше вариантов использования. Хотя было бы здорово, если бы пользователи ждали загрузки файла, а не зацикливания счетчика. Спасибо за подсказку!   -  person Ehvince    schedule 19.01.2017


Ответы (1)


Я задал вопрос в системе отслеживания проблем: https://github.com/Kozea/WeasyPrint/issues/416

Это невыполнимо, и предлагаемый обходной путь состоит в том, чтобы

разделить загрузку на два этапа: один маршрут асинхронно генерирует документ и сохраняет его в файловой системе, второй маршрут загружает сгенерированный документ. Когда документ еще не создан, вы можете скрыть вторую ссылку и вместо нее отобразить что-то вроде «документ еще не создан».

person Ehvince    schedule 30.01.2017