Как использовать python-docx для потоковой передачи файла из шаблона - PullRequest
0 голосов
/ 28 ноября 2018

Хорошо, сейчас у меня есть функция в приложении django, которая создает текстовый документ, например, так:

def form_view(request):

    if request.method == 'POST':
       #do a bunch of things
       context = { 
        'model_1' : model_1,
        }
        in_template = "Forms/mytemplate.docx"

        doc = DocxTemplate(in_template)
        doc.render(context)
        out_filename = "outfile.docx"
        http_word_response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document')
        http_word_response['Content-Disposition'] = 'attachment; filename=%s' % out_filename
        doc.save(http_word_response)
        return http_word_response

     else:
       return render( request, 'mysite/form.html', context)

Итак, сейчас файл обслуживается как переменная http_word_response и работаетотлично

Я хочу изменить это так, чтобы файл действительно создавался и сохранялся в S3, но я бы не хотел сначала сохранять файл локально, а просто использовать потоковую функцию пакета python-docx: https://python -docx.readthedocs.io / en / latest / user / documents.html # открытие файла-подобного-документа

Вот пример, который он дает:

with open('foobar.docx', 'rb') as f:
    source_stream = StringIO(f.read())
document = Document(source_stream)
source_stream.close()
...
target_stream = StringIO()
document.save(target_stream)

Я не уверен, как преобразовать этот пример в чтение в моем файле шаблона и вывести файл / объект, который я могу затем отправить на S3 и что-то сделать.

Моя лучшая догадка началась бы так:

        with open(in_template, 'rb') as f:
            source_stream = StringIO(f.read())
        doc = DocxTemplate(source_stream)
        source_stream.close()

        target_stream = StringIO()
        document.save(target_stream)

Но потом я запутался в том, куда идет моя часть doc.render(context) и как я могу изменить имя target_stream наимя файла, которое я хочу.

Любая помощь по началу работы с этим приветствуется.

...