Вернуть ответ PDF от STDOUT с Django
-
14-11-2019 - |
Вопрос
Я использую WHTMLTOPDF, чтобы создать файлы PDF, как когда-либо не знают, как вернуть их правильно, поэтому мне пришлось написать их в мою мультимедию папку, а затем перенаправлять на просто созданный файл.
Редактировать: Совет IAN - это написать на STDOUT, поэтому я изменил мою команду whtmltopdf, чтобы сделать это, но теперь я не знаю, как вернуть этот контент.
Я пытался использовать подпроцесс. Распостен так:
r = HttpResponse(Popen(command_args), mimetype='application/pdf')
r['Content-Disposition'] = 'filename=recibos.pdf'
return r
.
Но я не получаю хорошие результаты Заранее спасибо.
Решение
Вы должны открыть вашу команду sub, как так:
popen = Popen(command_args, stdout=PIPE, stderr=PIPE)
body_contents = popen.stdout().read()
popen.terminate()
popen.wait()
r = HttpResponse(body_contents, mimetype='application/pdf')
.
Некоторые вещи осторожны:
- Если ваша команда POPEN'D пишет в Стдерр, он может тупик.Вы можете решить это с помощью функции Comment () на объекте POPON.
- Вы должны попробовать /, наконец, это, чтобы убедиться, что всегда расторгнуть () и ждать ().
- Это загружает весь PDF в память вашего Python Process, вы можете захотеть трансмировать байты из команды на исходящий сокет.
Другие советы
Я не могу быть окончательным, потому что я только воспринимал .pdf Ответы в PHP, однако основная идея будет такой же.
1) Напишите свой файл PDF в STDOUT, а не файловую систему, так как вы должны вернуть любой другой тип страницы.
2) Отправить тогда с правильным типом MIME и заголовками.Это вероятно:
Удобрение контента: встроенный;filename="myreportfile.pdf" Тип содержимого: приложение / PDF
Вам может потребоваться проверить Cchache-Control и истекает заголовки, а также получить необходимое поведение.
Как вы хотите, чтобы они вернулись?
Если вы хотите их в качестве вложения, вы можете попробовать:
fname = #something here to give dynamic file names from your variables
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename='+fname
return response
.
Я хотел бы, чтобы у меня был ответ на то, как открыть PDF в браузере, но это фрагмент из проекта, который я сделал некоторое время назад, и я забыл некоторые детали.
Если вы просто хотите вернуть PDF в виде Django httpresponse:
from django.http import HttpResponse
def printTestPdf(request):
return printPdf('/path/to/theFile.pdf')
def printPdf(path):
with open(path, "rb") as f:
data = f.read()
return HttpResponse(data, mimetype='application/pdf')
.