91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django利用csv,HttpResponse,StreamingHttpResponse導出

發布時間:2020-06-20 12:03:13 來源:網絡 閱讀:935 作者:貧曾要吃肉 欄目:開發技術

一: 前言

django中,如何將網站數據csv文件給用戶下載?我們前面有學習過httpResponse,結合起來一起用。

二: 案例1-小文件導出

1. 案例描述
我們將數據庫中的信息,直接提供給客戶端下載;

  1. 新增數據庫模型,插入數據;
  2. 新建視圖,利用HttpResponse,csv模塊回去數據,生成csv格式返回;
  3. 新建url映射;
    這個案例中,這種方式僅可以解決數據量小的問題,如果數據量非常大的情況下,可能會因為服務器超時而無法導出。

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代碼
數據庫插入數據
Django利用csv,HttpResponse,StreamingHttpResponse導出

5. 訪問下載
http://127.0.0.1:8000/k02_httpresponse/csv_downloads1/
Django利用csv,HttpResponse,StreamingHttpResponse導出

Django利用csv,HttpResponse,StreamingHttpResponse導出


二: 案例2-生成csv文件

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("成功")

三: 案例3-大文件導出

假設我們需要導出一份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
Django利用csv,HttpResponse,StreamingHttpResponse導出Django利用csv,HttpResponse,StreamingHttpResponse導出

我們可以看到,在打開網頁在瞬間就開始下載,因為是邊生成數據,邊下載。


(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

Django利用csv,HttpResponse,StreamingHttpResponse導出

我們就可以發現,當我們打開網頁的時候,就是一只鏈接等待

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南木林县| 资讯| 崇信县| 平遥县| 奈曼旗| 读书| 彭山县| 威海市| 大化| 雷州市| 乌拉特后旗| 秦皇岛市| 紫金县| 信丰县| 武定县| 黑山县| 陕西省| 昌图县| 泽普县| 达孜县| 奇台县| 金湖县| 旌德县| 麦盖提县| 宽城| 长阳| 盐边县| 桂平市| 偃师市| 商河县| 闸北区| 彰化市| 林周县| 南昌市| 牙克石市| 南华县| 大田县| 巩留县| 兖州市| 通州市| 赤壁市|