用Flask生成word文件

前面我們已經實現了利用python-docx庫自動生成表格簡化工作流程的python腳本。具體請看:生活中的python-利用python-docx自動生成表格簡化工作流程

但是python腳本的缺點就是,如果想讓其他人使用,必須在其電腦上安裝相應的python環境。這對于電腦不熟練的人來說還是相當有難度的。于是就有了這篇文章---用Flask生成我們需要的word文件,之后將web程序部署到公網服務器上,這樣任何人都可以輕松的使用了。

整體思路很簡單,就是做一個web表單,然后在Flask里處理最后生成word供下載即可

關于如何生成word部分直接看上面的文章即可,這里說明下Flask部分需要注意的地方

一、使用BYtesIO讀寫數據

BYtesIO實現在內存中讀寫數據,我們這里可以先將生成的word文件放在服務器的內存上,然后供下載,代碼如下:

f = io.BytesIO()
document.save(f)

f就是我們生成的word文件并且放在了服務器的內存中。

二、Flask下載中文名文件

正常情況下,我們使用Flask的send_file下載文件沒有問題,但是如果要下載的文件名是中文的話,就會出現編碼錯誤。

解決方法就是從urllib.parse引入quote,首先對文件名進行編碼,然后send_file中作為attachment_filename的參數,這時候能成功下載文件,但是文件名是編碼后的名字,要解碼的話,我們需要在headers里面聲明編碼格式,即:

filename = quote(name + '清單.doc')
rv = send_file(f, as_attachment=True, attachment_filename=filename)
rv.headers['Content-Disposition'] += "; filename*=utf-8''{}".format(filename)

這樣,對文件名進行UTF-8解碼,Flask就可以正常下載中文名文件了

三、同時下載兩個(多個)文件問題

因為我的需求是輸入一次信息,生成兩個不同的word文件。而瀏覽器似乎無法實現一個submit按鈕同時下載兩個文件。所以,只能用兩個submit按鈕下載不同的word文件。這里我的思路是,將兩個submit按鈕設置成同樣的name值,不同的value值,然后通過request.form[]來獲取數據:

if request.form['key'] == '申請表下載':
    pass
elif request.form['key'] == '清單下載':
    pass

說明

源代碼已經上傳至:https://github.com/juventusryp/flask_create_word

下一篇將講述如何將web程序部署到公網服務器上。

參考鏈接:
StringIO和BytesIO
Flask 下載中文名文件

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • # Python 資源大全中文版 我想很多程序員應該記得 GitHub 上有一個 Awesome - XXX 系列...
    aimaile閱讀 26,595評論 6 427
  • # Python 資源大全中文版 我想很多程序員應該記得 GitHub 上有一個 Awesome - XXX 系列...
    小邁克閱讀 3,056評論 1 3
  • 22年12月更新:個人網站關停,如果仍舊對舊教程有興趣參考 Github 的markdown內容[https://...
    tangyefei閱讀 35,241評論 22 257
  • 上班第二天,能在晚上十點前坐在自己的小筆記本前寫日更,是一件非常愜意的事情。想想昨天還是帶了備課本在挑燈夜戰,真正...
    莜薇閱讀 396評論 0 1
  • 認識那么久 換來的傷痛 給不了你什么 說分...
    污妖神閱讀 240評論 0 0