Django error Broken pipe from ('127.0.0.1', 1628) when exporting to pdf using Xhtml2pdf
У меня есть django представление, которое экспортирует записи, используя библиотеку xhtml2pdf, однако я заметил, что представление обновляется несколько раз, пока моя функция pdf обрабатывает запрос. Кроме того, при таком поведении представление перезагружается несколько раз, пока файл не будет готов к экспорту. Это потенциально опасно, поскольку представление запрашивает данные в большом количестве для загрузки в pdf. Ошибка, которую я получаю из терминала, выглядит так:
Сломанная труба от ('127.0.0.1', 1314)
Я где-то читал, что это может быть результатом закрытия и открытия соединения браузером, но я тестировал на другом представлении, загружая страницу и задерживая ответ, но это не произошло, как описано выше.
Это мой views.py:
@login_required(login_url='/')
@user_passes_test(validate_all_view())
def export_assets(request):
if request.method == 'POST':
checkbox_list = request.POST.getlist('id[]')
if not len(checkbox_list) > 0:
messages.error(request, "You must select at least one row to export.")
return redirect('view_active_assets')
queryset = Assets.objects.filter(id__in=checkbox_list)[:10000]
if 'excel' in request.POST:
return process_excel_export(queryset)
if 'pdf' in request.POST:
return process_pdf_export(request, queryset)
else:
return redirect('view_active_assets')
функция рендеринга:
def render_to_pdf(template_src, context_dict={}):
template = get_template(template_src)
html = template.render(context_dict)
result = BytesIO()
pdf = pisa.pisaDocument(BytesIO(html.encode("UTF-8")), result)
if not pdf.err:
return HttpResponse(result.getvalue(), content_type='application/pdf')
return None
Обработать функцию pdf:
def process_pdf_export(request, queryset):
domain = settings.DOMAIN
context = {'queryset': queryset, 'asset_count': queryset.count()}
pdf = render_to_pdf('dashboard/pdf_templates/assets_pdf.html', context)
response = HttpResponse(pdf, content_type='application/pdf')
filename = "Assets Export.pdf"
content = "inline; filename=%s" % (filename)
download = request.GET.get("download")
if download:
content = "attachment; filename='%s'" % (filename)
response['Content-Disposition'] = content
return response