django 生成和下載CSV文件


一、生成小型的csv文件

1、直接處理數據

from django.http import HttpResponse
import csv

# 簡單生成下載csv文件
def down_csv_1(request):
    # 指定返回的類型為csv
    response = HttpResponse(content_type='text/csv')
    # 添加返回頭說明如何處理這個返回對象,並指明文件名。attachment:作為附件的形式進行下載
    response['Content-Disposition'] = "attachment;filename='test.csv'"
    # 創建寫的對象
    writer = csv.writer(response)
    # 寫入一行數據
    writer.writerrow(['username','age'])
    # 寫入下一行數據
    writer.writerrow(['Xsan',20])
    return response


2、使用模版處理要下載的數據:

(1)在templates文件夾下面創建處理數據的模版文件比如test.txt。
test.txt文件

{# 一定要將循環體和for語句寫在一行,否則會出現空行的情況 #}
{% for row in rows %}{{ row.0 }},{{ row.1 }}
{% endfor %}

(2)在視圖函數中引用

views.py
from django.http import HttpResponse
from django.template import loader
import csv

#使用模版處理要下載的數據
def down_csv_2(request):
    # 指定返回的類型為csv
    response = HttpResponse(content_type='text/csv')
    # 添加返回頭說明如何處理這個返回對象,並指明文件名。attachment:作為附件的形式進行下載
    response['Content-Disposition'] = "attachment;filename='test.csv'"
    # 創建要下載的數據,此時要和模版結合起來
    context = {
        'rows':[
        ['username','age'],
        ['Xsan',20]]
    }
    # 引用自定義的模版
    template = loader.get_template('test.txt')
    # 將要下載的數據使用模版格式化
    csv_template = template.render(context)
    # 將處理好的數據渲染至上下文
    response.content = csv_template
    return response

二、生成大型的csv文件
上面我們講了生成一個小的csv文件,如果要生成大型的csv文件該如何做呢?上面的代碼可能會發生超時的情況(服務器要生成一個大型的csv文件,需要的時間可能會超過瀏覽器默認的時間)。這時候我們需要借助一個類StreamingHttpResponse對象,這個對象能將響應的數據作為一個流返回給客戶端,而不是作為一個整體返回。
關於StreamingHttpResponse:
這個類時專門用來處理流數據的。使得在處理大型文件的時候,不會因為服務器處理時間過長而導致連接超時。這個類不是繼承自HttpResponse,並且跟HttpResponse對比有以下幾點區別:
1、這個類沒有屬性content,相反是streaming_content。
2、這個類的streaming_content必須是一個可迭代對象。
3、這個類沒有write方法,如果給這個類的對象寫入數據將會報錯。
注意:StreamingHttpResponse會啟動一個進程來和客戶端保持長連接,所以會很消耗資源。所以如果不是特殊要求,盡量少用這種方法。

    views.py
    from django.http import HttpResponse,StreamingHttpResponse 
    from django.template import loader
    import csv
    
    def large_csv_view(request):
        response = StreamingHttpResponse(content_type='text/csv')
        response['Content-Disposition'] = "attachment;filename='large.csv'"
        rows = ("Row {},{}\n".format(row,row) for row in range(0,10000))
        response.streaming_content = ("username,age\n","Xsan,20\n")
        return response


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM