您好,登錄后才能下訂單哦!
django中,如何將網站數據csv文件給用戶下載?我們前面有學習過httpResponse,結合起來一起用。
1. 案例描述
我們將數據庫中的信息,直接提供給客戶端下載;
2. 數據庫代碼
from django.db import models
# Create your models here.
class Article(models.Model):
id = models.BigAutoField(primary_key=True)
title = models.CharField(max_length=100)
content = models.TextField()
price = models.FloatField(default=0)
create_time = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'k1_method_article'
#使用makegrations生成遷移腳本
#python manage.py makemigrations
# 將新生成的腳本文件映射到數據庫中
# python manage.py migrate
3. 視圖代碼
def csv_downloads1(request):
data = [] #最終要返回的列表數據
db_result = Article.objects.all()
for row in db_result:
source_data = [] #將數據庫的每行信息生成一個列表
source_data.append(row.title)
source_data.append(row.content)
source_data.append(row.price)
data.append(source_data) #將每一行數據列表,加入到一個大列表中
response = HttpResponse(content_type='text/csv') #定義一個HttpResponse,類型是CSV
response['Content-Disposition'] = "attachment;filename=huangjaijin.csv" #定義返回的信息,附件方式及文件名稱;
writer = csv.writer(response) #利用csv模塊寫入response
writer.writerow(['標題', '內容', '價格']) #標題行
for row in data:
writer.writerow(row) #循環寫入數據庫信息
return response
3. URL代碼
urlpatterns = [
path('csv_downloads1/', views.csv_downloads1, name='csv_downloads1'),
]
4. URL代碼
數據庫插入數據
5. 訪問下載
http://127.0.0.1:8000/k02_httpresponse/csv_downloads1/
def csv_downloads2(request):
data = [
['Name', 'Height'],
['Keys', '176cm'],
['HongPing', '160cm'],
['WenChao', '176cm']
]
with open('templates/abc.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f, dialect='excel')
for row in data:
writer.writerow(row)
return HttpResponse("成功")
假設我們需要導出一份1000W行的數據csv文件,使用案例1的方法是生成數據,然后csv寫入response(等待寫入),寫入完成后,網頁返回下載;那么在寫入過程,就有可能因為服務器超時異常。有沒有邊生成,邊下載的方式呢?我們可以使用StreamingHttpResponse對象實現。代碼如下:
(1)利用使用StreamingHttpResponse實現
def large_csv_downloads(request):
# 使用StreamingHttpResponse
response = StreamingHttpResponse(content_type='text/csv')
response['Content-Disposition'] = "attachment;filename=huangjaijin.csv"
result = ("Row {}, {} \n".format(row, row) for row in range(0, 10000000)) #生成器
'''
print(type(result)): <class 'generator'>
print(result): <generator object large_csv_downloads.<locals>.<genexpr> at 0x0000000004512660>
'''
response.streaming_content = result
return response
注:生成器案例講解
In [38]: L = [x*2 for x in range(5)]
In [39]: L
Out[39]: [0, 2, 4, 6, 8]
In [40]: G = (x*2 for x in range(5)) #區別就是[]變成()
In [41]: G
Out[41]: <generator object <genexpr> at 0x7fad5268d910>
In [42]: for num in G:
...: print(num)
...:
0
2
4
6
8
下載地址:http://127.0.0.1:8000/k02_httpresponse/large_csv_downloads
我們可以看到,在打開網頁在瞬間就開始下載,因為是邊生成數據,邊下載。
(2)普通csv和HttpResponse
這里的案例就是,我們使用普通的方式下載同樣的打的文件,試試。
def large_csv_downloads(request):
#使用HttpResponse
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = "attachment;filename=huangjaijin.csv"
writer = csv.writer(response)
for row in range(0, 10000000):
writer.writerow(['Row {}'.format(row), ''.format(row)])
return response
我們就可以發現,當我們打開網頁的時候,就是一只鏈接等待
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。