Django使用視圖動(dòng)態(tài)輸出CSV以及PDF的操作詳解
Django 如何使用視圖動(dòng)態(tài)輸出 CSV 以及 PDF
這一篇我們需要用到 python
的 csv
和 reportLab
庫,通過django視圖來定義輸出我們需要的 csv
或者 pdf
文件。
一、csv文件
打開我們的視圖文件 testsite/members/views.py
。新增一個(gè)視圖方法:
import csv # 導(dǎo)入python的csv包 def some_view(request): # Create the HttpResponse object with the appropriate CSV header. response = HttpResponse( content_type="text/csv", headers={"Content-Disposition": 'attachment; filename="somefilename.csv"'}, ) writer = csv.writer(response) writer.writerow(["第一行", "Foo", "Bar", "Baz"]) writer.writerow(["第二行", "A", "B", "C", '"Testing"', "Here's a quote"]) return response
在上面代碼里面
- 響應(yīng)會(huì)獲得一個(gè)特殊的
MIME
類型text/csv
。會(huì)告訴瀏覽器該文檔是一個(gè)CSV
文件,而不是HTML
文件。 - 響應(yīng)會(huì)獲得一個(gè)附加
Content-Disposition
標(biāo)頭,其中包含CSV
文件的名稱。此文件名是任意的;您可以隨意命名。瀏覽器會(huì)在“另存為…”對(duì)話框中使用它。 response
您可以通過將作為第一個(gè)參數(shù)傳遞給 來掛接CSV
生成API csv.writer
。該csv.writer
函數(shù)需要一個(gè)類似文件的對(duì)象,并且HttpResponse
對(duì)象符合要求。- 對(duì)于
CSV
文件中的每一行,調(diào)用writer.writerow
,并將一個(gè) 可迭代的傳遞給它。 CSV
模塊會(huì)為您處理引號(hào),因此您不必?fù)?dān)心轉(zhuǎn)義帶引號(hào)或逗號(hào)的字符串。傳遞writerow()
您的原始字符串,它會(huì)做正確的事情。
然后打開我們的路由文件 testsite/members/urls.py
,添加一個(gè)路由:
path('csv/', views.some_view, name='csv'),
訪問我們的 http://127.0.0.1:8000/members/csv
地址,可以得到一個(gè) csv
文件。如下圖所示:
打開文件里面就是我們自定義格式的 csv
。
如果當(dāng)我們?cè)谑褂昧魇絺鬏敶笮?csv
文件的時(shí)候,在處理生成非常大響應(yīng)的視圖時(shí),就要改用 Django StreamingHttpResponse
為啥要改成這個(gè)呢
舉個(gè)例子,通過流式傳輸需要很長時(shí)間才能生成的文件,您可以避免負(fù)載平衡器在服務(wù)器生成響應(yīng)時(shí)丟棄可能超時(shí)的連接。
在下面例子中,我們就可以充分利用 Python
生成器來高效處理大型 CSV
文件的組裝和傳輸,打開 testsite/members/views.py
文件:
import csv from django.http import StreamingHttpResponse class Echo: """An object that implements just the write method of the file-like interface. """ def write(self, value): """Write the value by returning it, instead of storing in a buffer.""" return value def some_streaming_csv_view(request): """A view that streams a large CSV file.""" rows = (["Row {}".format(idx), str(idx)] for idx in range(65536)) pseudo_buffer = Echo() writer = csv.writer(pseudo_buffer) return StreamingHttpResponse( (writer.writerow(row) for row in rows), content_type="text/csv", headers={"Content-Disposition": 'attachment; filename="somefilename.csv"'}, )
添加我們的路由,打開我們的 testsite/members/urls.py
文件:
path('csv-stream/', views.some_streaming_csv_view, name='csv'),
瀏覽器訪問 http://127.0.0.1:8080/members/csv-stream
流式輸出文件:
打開這個(gè)文件如圖示:
當(dāng)然還一種方式來生成 csv
,通過 django
的模版系統(tǒng)。下面跟著代碼來試一下這種方法:
依然還是先打開視圖文件 testsite/members/views.py
:
from django.http import HttpResponse from django.template import loader def some_view(request): response = HttpResponse( content_type="text/csv", headers={"Content-Disposition": 'attachment; filename="somefilename.csv"'}, ) csv_data = ( ("First row", "Foo", "Bar", "Baz"), ("Second row", "A", "B", "C", '"Testing"', "Here's a quote"), ) t = loader.get_template("my_template_name.txt") c = {"data": csv_data} response.write(t.render(c)) return response
添加我們的路由,打開我們的 testsite/members/urls.py
文件:
path('csv-template/', views.some_view_tem, name='csv'),
在當(dāng)前目錄下面的 templates
文件夾創(chuàng)建我們的模板文件 my_template_name.txt
:
{% for row in data %}"{{ row.0|addslashes }}", "{{ row.1|addslashes }}", "{{ row.2|addslashes }}", "{{ row.3|addslashes }}", "{{ row.4|addslashes }}" {% endfor %}
瀏覽器訪問 http://127.0.0.1:8080/members/csv-template
流式輸出文件:
就可以得到我們自定義模板的 csv
文件。
二、如何創(chuàng)建 PDF 文件
由于 python
擁有出色的開源 ReportLab Python PDF
庫,使得我們動(dòng)態(tài)生成 pdf
非常有優(yōu)勢。
首先我們安裝ReportLab 庫:
py -m pip install reportlab
我們可以看到下列結(jié)果:
使用 django
動(dòng)態(tài)生成 pdf
的關(guān)鍵在于 ReportLab API
作用于類似文件的對(duì)象,而 Django
的FileResponse
對(duì)象接受類似文件的對(duì)象。
打開我們的 testsite/members/views.py
視圖文件:
import io from django.http import FileResponse from reportlab.pdfgen import canvas def some_view_pdf(request): buffer = io.BytesIO() p = canvas.Canvas(buffer) p.drawString(100, 100, "Hello world.") p.showPage() p.save() buffer.seek(0) return FileResponse(buffer, as_attachment=True, filename="hello.pdf")
代碼里面我講一下大概的含義:
- 響應(yīng)將 根據(jù)文件擴(kuò)展名 自動(dòng)設(shè)置
MIME
類型application/pdf
。這就告訴瀏覽器該文檔是PDF
文件,而不是HTML
文件或通用application/octet-stream
二進(jìn)制內(nèi)容。 - 當(dāng)
as_attachment=True
傳遞給時(shí)FileResponse
,它會(huì)設(shè)置適當(dāng)?shù)?Content-Disposition
標(biāo)頭,并告訴網(wǎng)絡(luò)瀏覽器彈出一個(gè)對(duì)話框,提示/確認(rèn)如何處理文檔,即使機(jī)器上設(shè)置了默認(rèn)值。如果as_attachment
省略該參數(shù),瀏覽器將使用已配置用于PDF
的任何程序/插件來處理PDF
。 filename
定義你需要輸出的pdf
名字。瀏覽器將在“另存為…”對(duì)話框中使用它。- 可以掛接到
ReportLab API
:作為第一個(gè)參數(shù)傳遞的相同緩沖區(qū)canvas.Canvas
可以提供給該類FileResponse
。 - 所有后面的
PDF
生成方法均在PDF
對(duì)象(上面例子中為p)上調(diào)用,而不是在 上調(diào)用buffer
。 showPage()
最后,調(diào)用并save()
查看PDF
文件非常重要。
添加我們的路由,打開我們的 testsite/members/urls.py
文件:
path('csv-stream/', views.some_streaming_csv_view, name='csv'),
瀏覽器訪問 http://127.0.0.1:8080/members/pdf
:
打開 pdf
文件,就可以看到我們自動(dòng)輸出的 pdf
文件:
ReportLab
并不是線程安全的。
所以一些小伙伴在構(gòu)建 PDF
生成 Django
視圖時(shí)出現(xiàn)的奇怪問題,這些視圖就是由于許多人同時(shí)訪問造成的。
三、總結(jié)
雖然 csv
文件和 pdf
文件的動(dòng)態(tài)生成技術(shù)很常見,也是業(yè)務(wù)中經(jīng)常用到的,我們文中所用到的只是其中的某個(gè)包,比如 reportlab
。
在 django
官方的 packages
有更詳細(xì)不同包的比較,以及他們的使用方式,https://djangopackages.org/grids/g/pdf/
。
利用這兩個(gè)工具結(jié)合我們的 django
視圖,就完全的能和我們自己開發(fā)的系統(tǒng)結(jié)合起來了。
根據(jù)相應(yīng)的顯示字段動(dòng)態(tài)生成一切我們想要的文件,是非常方便的。
以上就是Django使用視圖動(dòng)態(tài)輸出CSV以及PDF的操作詳解的詳細(xì)內(nèi)容,更多關(guān)于Django視圖輸出CSV及PDF的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
利用python檢查磁盤空間使用情況的代碼實(shí)現(xiàn)
本文將向讀者展示如何利用Python編寫自動(dòng)化腳本,以檢查磁盤空間使用情況,無論你是經(jīng)驗(yàn)豐富的系統(tǒng)管理員,還是對(duì)Python自動(dòng)化充滿興趣的開發(fā)者,本文都將為你提供實(shí)用的腳本示例和詳細(xì)的解析步驟,幫助你快速掌握磁盤空間監(jiān)控的自動(dòng)化方法,需要的朋友可以參考下2024-08-08Python實(shí)現(xiàn)深度遍歷和廣度遍歷的方法
今天小編就為大家分享一篇Python實(shí)現(xiàn)深度遍歷和廣度遍歷的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01Python創(chuàng)建相同值數(shù)組/列表的兩種方法
眾所周知數(shù)組是一種用來在計(jì)算機(jī)中存儲(chǔ)連續(xù)的相同類型數(shù)值的數(shù)據(jù)結(jié)構(gòu),這篇文章主要給大家介紹了關(guān)于Python創(chuàng)建相同值數(shù)組/列表的兩種方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12Python實(shí)現(xiàn)PDF和TIFF格式之間的相互轉(zhuǎn)換
PDF是數(shù)據(jù)文檔管理領(lǐng)域常用格式之一,主要用于存儲(chǔ)和共享包含文本、圖像、表格、鏈接等的復(fù)雜文檔,而TIFF常見于圖像處理領(lǐng)域, 在實(shí)際應(yīng)用中,我們可能有時(shí)需要將PDF文件轉(zhuǎn)換為TIFF圖像,本文將介紹如何使用Python實(shí)現(xiàn)PDF和TIFF格式之間的相互轉(zhuǎn)換,需要的朋友可以參考下2024-07-07Python paramiko 模塊淺談與SSH主要功能模擬解析
這篇文章主要介紹了Python paramiko 模塊詳解與SSH主要功能模擬,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02keras slice layer 層實(shí)現(xiàn)方式
這篇文章主要介紹了keras slice layer 層實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06