Django从理论到实战(part45)--下载CSV文件
學(xué)習(xí)筆記,僅供參考,有錯必糾
參考自:Django打造大型企業(yè)官網(wǎng)–Huang Y;
文章目錄
- CSV文件
- 生成小的CSV文件
- 將`csv`文件定義成模板
- 生成大的CSV文件
- StreamingHttpResponse類
 
 
CSV文件
生成小的CSV文件
首先,我們在項(xiàng)目文件夾的views.py文件中,定義一個視圖函數(shù):
import csv from django.http import HttpResponsedef csv_view(request):response = HttpResponse(content_type='text/csv')#初始化HttpResponse的時候,指定Content-Type為text/csvresponse['Content-Disposition'] = 'attachment; filename="somefilename.csv"'#在response中添加一個Content-Disposition頭#attachment:瀏覽器將不會對這個文件進(jìn)行顯示,而是作為附件的形式下載#filename="somefilename.csv":指定這個csv文件的名字writer = csv.writer(response)#使用csv模塊的writer方法,將相應(yīng)的數(shù)據(jù)寫入到response中writer.writerow(['username', 'age', 'height', 'weight'])writer.writerow(['Huang', '19', '30', '12'])return response在主urls.py文件中,我們添加路由:
from django.contrib import admin from django.urls import path from . import views from django.conf.urls import includeurlpatterns = [path('admin/', admin.site.urls),path("csv_view/", views.csv_view, name = "csv_view"), ]向http://127.0.0.1:8000/csv_view發(fā)起請求,somefilename.csv文件被下載:
打開該文件:
將csv文件定義成模板
我們還可以將csv格式的文件定義成模板,然后使用Django內(nèi)置的模板系統(tǒng),并給這個模板傳入一個Context對象,這樣模板系統(tǒng)就會根據(jù)傳入的Context對象,生成具體的csv文件。
首先,我們定義一個模板文件downLoad.html:
{% for row in rows %} {{ row.0 }},{{ row.1 }} {% endfor %}在views.py文件中定義一個視圖函數(shù):
def csv_view(request):response = HttpResponse(content_type='text/csv')response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'context = {"rows" : [["username", "age"],["Huang", 19]] }template = loader.get_template("downLoad.html")csv_template = template.render(context)response.content = csv_templatereturn response向http://127.0.0.1:8000/csv_view發(fā)起請求,打開下載后的csv文件:
生成大的CSV文件
我們可以借助StreamingHttpResponse對象,這個對象是將響應(yīng)的數(shù)據(jù)作為一個流返回給客戶端,而不是作為一個整體返回。
首先,我們在views.py文件中添加視圖函數(shù):
def large_csv_view(request):response = StreamingHttpResponse(content_type='text/csv')response['Content-Disposition'] = 'attachment; filename="largeFile.csv"'rows = ("Row {},Value {}\n".format(row, row) for row in range(0, 100))response.streaming_content = rowsreturn response定義主urls.py文件:
from django.contrib import admin from django.urls import path from . import views from django.conf.urls import includeurlpatterns = [path('admin/', admin.site.urls),path('', views.index, name = "index"),path("csv_view/", views.csv_view, name = "csv_view"),path("large_csv_view/", views.large_csv_view, name = "large_csv_view"), ]向http://127.0.0.1:8000/large_csv_view發(fā)起請求,largeFile.csv文件被下載:
StreamingHttpResponse類
這個類是專門用來處理流數(shù)據(jù)的。使得在處理一些大型文件的時候,不會因?yàn)榉?wù)器處理時間過長而到時連接超時。這個類不是繼承自HttpResponse,并且跟HttpResponse對比有以下幾點(diǎn)區(qū)別:
注意:StreamingHttpResponse會啟動一個進(jìn)程來和客戶端保持長連接,所以會很消耗資源。所以如果不是特殊要求,盡量少用這種方法。
總結(jié)
以上是生活随笔為你收集整理的Django从理论到实战(part45)--下载CSV文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 潮流时尚的穿搭文案句子65句
- 下一篇: Django从理论到实战(part46)
