Generating word docs with Flask?

Question:

I’m trying to spin up a single page flask application that allows users to download a word document. I’ve already figured out how to make/save the document using python-docx, but now I need to make the document available in the response. Any ideas?

Here’s what I have so far:

from flask import Flask, render_template
from docx import Document
from cStringIO import StringIO

@app.route('/')
def index():
    document = Document()
    document.add_heading("Sample Press Release", 0)
    f = StringIO()
    document.save(f)
    length = f.tell()
    f.seek(0)
    return render_template('index.html')
Asked By: BarFooBar

||

Answers:

instead of render_template('index.html') you can just:

from flask import Flask, render_template, send_file
from docx import Document
from cStringIO import StringIO

@app.route('/')
def index():
    document = Document()
    document.add_heading("Sample Press Release", 0)
    f = StringIO()
    document.save(f)
    length = f.tell()
    f.seek(0)
    return send_file(f, as_attachment=True, attachment_filename='report.doc')
Answered By: Doobeh

You could use the send_from_directory as in this answer.

If you are sending text, you could also use the make_response helper as in this answer.

Answered By: vikramls

Use

return Response(generate(), mimetype='text/docx')

Generate() should be replaced with f in your case
For more information look at streaming in flask
http://flask.pocoo.org/docs/1.0/patterns/streaming/

Answered By: Patrick Mutuku

For those who pass after me…

referring to these two links:

io.StringIO now replaces cStringIO.StringIO

also it will raise an error
as document.save(f) should receive a pass or binary file

code should be like this:

from flask import Flask, render_template, send_file
from docx import Document
from io import BytesIO

@app.route('/')
def index():
    document = Document()
    f = BytesIO()
    # do staff with document
    document.save(f)
    f.seek(0)

    return send_file(
        f,
        as_attachment=True,
        attachment_filename='report.docx'
    )

Answered By: Abd-Elaziz Sharaf
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.