最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django使用視圖動態(tài)輸出CSV以及PDF的操作詳解

 更新時間:2024年06月28日 08:42:21   作者:我碼玄黃  
這篇文章主要介紹了Django 如何使用視圖動態(tài)輸出 CSV 以及 PDF,我們需要用到 python 的 csv 和 reportLab 庫,通過django視圖來定義輸出我們需要的 csv 或者 pdf 文件,需要的朋友可以參考下

Django 如何使用視圖動態(tài)輸出 CSV 以及 PDF

這一篇我們需要用到 pythoncsvreportLab 庫,通過django視圖來定義輸出我們需要的 csv 或者 pdf 文件。

一、csv文件

打開我們的視圖文件 testsite/members/views.py 。新增一個視圖方法:

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)會獲得一個特殊的 MIME 類型 text/csv。會告訴瀏覽器該文檔是一個 CSV 文件,而不是 HTML 文件。
  • 響應(yīng)會獲得一個附加 Content-Disposition 標(biāo)頭,其中包含 CSV 文件的名稱。此文件名是任意的;您可以隨意命名。瀏覽器會在“另存為…”對話框中使用它。
  • response 您可以通過將作為第一個參數(shù)傳遞給 來掛接 CSV 生成 API csv.writer 。該 csv.writer 函數(shù)需要一個類似文件的對象,并且 HttpResponse 對象符合要求。
  • 對于 CSV 文件中的每一行,調(diào)用 writer.writerow ,并將一個 可迭代的傳遞給它。
  • CSV 模塊會為您處理引號,因此您不必?fù)?dān)心轉(zhuǎn)義帶引號或逗號的字符串。傳遞 writerow() 您的原始字符串,它會做正確的事情。

然后打開我們的路由文件 testsite/members/urls.py ,添加一個路由:

path('csv/', views.some_view, name='csv'),

訪問我們的 http://127.0.0.1:8000/members/csv 地址,可以得到一個 csv 文件。如下圖所示:

打開文件里面就是我們自定義格式的 csv 。

如果當(dāng)我們在使用流式傳輸大型 csv 文件的時候,在處理生成非常大響應(yīng)的視圖時,就要改用 Django StreamingHttpResponse 為啥要改成這個呢

舉個例子,通過流式傳輸需要很長時間才能生成的文件,您可以避免負(fù)載平衡器在服務(wù)器生成響應(yīng)時丟棄可能超時的連接。

在下面例子中,我們就可以充分利用 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 流式輸出文件:

打開這個文件如圖示:

當(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 庫,使得我們動態(tài)生成 pdf 非常有優(yōu)勢。

首先我們安裝ReportLab 庫:

  py -m pip install reportlab

我們可以看到下列結(jié)果:

使用 django 動態(tài)生成 pdf 的關(guān)鍵在于 ReportLab API 作用于類似文件的對象,而 Django 的FileResponse 對象接受類似文件的對象。

打開我們的 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ò)展名 自動設(shè)置 MIME 類型 application/pdf 。這就告訴瀏覽器該文檔是 PDF 文件,而不是 HTML 文件或通用 application/octet-stream 二進(jìn)制內(nèi)容。
  • 當(dāng) as_attachment=True 傳遞給時 FileResponse ,它會設(shè)置適當(dāng)?shù)?Content-Disposition 標(biāo)頭,并告訴網(wǎng)絡(luò)瀏覽器彈出一個對話框,提示/確認(rèn)如何處理文檔,即使機(jī)器上設(shè)置了默認(rèn)值。如果as_attachment 省略該參數(shù),瀏覽器將使用已配置用于 PDF 的任何程序/插件來處理 PDF
  • filename 定義你需要輸出的 pdf 名字。瀏覽器將在“另存為…”對話框中使用它。
  • 可以掛接到 ReportLab API :作為第一個參數(shù)傳遞的相同緩沖區(qū) canvas.Canvas 可以提供給該類 FileResponse
  • 所有后面的 PDF 生成方法均在 PDF 對象(上面例子中為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 文件,就可以看到我們自動輸出的 pdf 文件:

ReportLab 并不是線程安全的。

所以一些小伙伴在構(gòu)建 PDF 生成 Django 視圖時出現(xiàn)的奇怪問題,這些視圖就是由于許多人同時訪問造成的。

三、總結(jié)

雖然 csv 文件和 pdf 文件的動態(tài)生成技術(shù)很常見,也是業(yè)務(wù)中經(jīng)常用到的,我們文中所用到的只是其中的某個包,比如 reportlab

django 官方的 packages 有更詳細(xì)不同包的比較,以及他們的使用方式,https://djangopackages.org/grids/g/pdf/。

利用這兩個工具結(jié)合我們的 django 視圖,就完全的能和我們自己開發(fā)的系統(tǒng)結(jié)合起來了。

根據(jù)相應(yīng)的顯示字段動態(tài)生成一切我們想要的文件,是非常方便的。

以上就是Django使用視圖動態(tài)輸出CSV以及PDF的操作詳解的詳細(xì)內(nèi)容,更多關(guān)于Django視圖輸出CSV及PDF的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python中對正則表達(dá)式re包的簡單引用方式

    python中對正則表達(dá)式re包的簡單引用方式

    這篇文章主要介紹了python中對正則表達(dá)式re包的簡單引用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Python中移動文件的實現(xiàn)方法匯總

    Python中移動文件的實現(xiàn)方法匯總

    在Python編程中,經(jīng)常會遇到需要移動文件的場景,例如文件的整理、備份等,這就需要借助Python的相關(guān)庫和方法來實現(xiàn)類似mv命令的功能,本文給大家匯總了Python移動文件的實現(xiàn)方法,需要的朋友可以參考下
    2025-07-07
  • python判斷列表字典字符串元組是否存在某個值或者空值(多種方法)

    python判斷列表字典字符串元組是否存在某個值或者空值(多種方法)

    這篇文章主要介紹了python判斷列表字典字符串元組是否存在某個值或者空值,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-02-02
  • 解讀Pandas和Polars的區(qū)別及說明

    解讀Pandas和Polars的區(qū)別及說明

    Pandas和Polars是Python中用于數(shù)據(jù)處理的兩個庫,Pandas適用于中小規(guī)模數(shù)據(jù)的快速原型開發(fā)和復(fù)雜數(shù)據(jù)操作,而Polars則專注于高效數(shù)據(jù)處理,支持大規(guī)模數(shù)據(jù)和高性能計算
    2025-02-02
  • 使用Django框架中ORM系統(tǒng)實現(xiàn)對數(shù)據(jù)庫數(shù)據(jù)增刪改查

    使用Django框架中ORM系統(tǒng)實現(xiàn)對數(shù)據(jù)庫數(shù)據(jù)增刪改查

    這篇文章主要介紹了使用Django的ORM實現(xiàn)對數(shù)據(jù)庫數(shù)據(jù)增刪改查方法,文中附含詳細(xì)示例代碼以及過程詳解,有需要的朋友可以借鑒參考下
    2021-09-09
  • 超實用的 10 段 Python 案例

    超實用的 10 段 Python 案例

    Python是目前最流行的語言之一,它在數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)、web開發(fā)、腳本編寫、自動化方面被許多人廣泛使用。它的簡單和易用性造就了它如此流行的原因。今天這篇文章就給大家分享 10 段超級有用的 Python 案例,需要的朋友可以參考一下
    2021-09-09
  • Python基礎(chǔ)之字典常見操作經(jīng)典實例詳解

    Python基礎(chǔ)之字典常見操作經(jīng)典實例詳解

    這篇文章主要介紹了Python基礎(chǔ)之字典常見操作,結(jié)合實例形式詳細(xì)分析了Python基本功能、創(chuàng)建、內(nèi)置函數(shù)與相關(guān)使用技巧,需要的朋友可以參考下
    2020-02-02
  • Python項目 基于Scapy實現(xiàn)SYN泛洪攻擊的方法

    Python項目 基于Scapy實現(xiàn)SYN泛洪攻擊的方法

    今天小編就為大家分享一篇Python項目 基于Scapy實現(xiàn)SYN泛洪攻擊的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • 基于python log取對數(shù)詳解

    基于python log取對數(shù)詳解

    今天小編就為大家分享一篇基于python log取對數(shù)詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Python 可視化matplotlib模塊基礎(chǔ)知識

    Python 可視化matplotlib模塊基礎(chǔ)知識

    這篇文章主要給大家分享的是Python 可視化matplotlib模塊基礎(chǔ)知識,文章對matplotlib.pyplot 模塊繪制相關(guān)如折線、柱狀、散點(diǎn)、圓餅圖表進(jìn)行簡單地學(xué)習(xí),具有一定的參考價值,需要的朋友可以參考一下
    2021-12-12

最新評論

大邑县| 泸溪县| 霍山县| 石嘴山市| 卓尼县| 阿坝县| 郯城县| 武冈市| 凤冈县| 忻城县| 临泽县| 九龙县| 卢氏县| 石楼县| 韶关市| 同江市| 洞口县| 舒兰市| 呼图壁县| 安陆市| 镇江市| 射洪县| 阳谷县| 什邡市| 台湾省| 衡水市| 赫章县| 阜城县| 治多县| 越西县| 措美县| 准格尔旗| 仁寿县| 无棣县| 玉环县| 屏南县| 龙岩市| 墨玉县| 高青县| 大名县| 冷水江市|