当前位置 : 主页 > 编程语言 > python >

Django从理论到实战(part45)--下载CSV文件

来源:互联网 收集:自由互联 发布时间:2022-06-15
学习笔记,仅供参考,有错必纠 参考自:Django打造大型企业官网–Huang Y; 文章目录 ​​CSV文件​​ ​​生成小的CSV文件​​ ​​将`csv`文件定义成模板​​ ​​生成大的CSV文件​​

学习笔记,仅供参考,有错必纠

参考自:Django打造大型企业官网–Huang Y;



文章目录

  • ​​CSV文件​​
  • ​​生成小的CSV文件​​
  • ​​将`csv`文件定义成模板​​
  • ​​生成大的CSV文件​​
  • ​​StreamingHttpResponse类​​



CSV文件



生成小的CSV文件



首先,我们在项目文件夹的views.py文件中,定义一个视图函数:

import csv
from django.http import HttpResponse

def csv_view(request):
response = HttpResponse(content_type='text/csv')
#初始化HttpResponse的时候,指定Content-Type为text/csv
response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'
#在response中添加一个Content-Disposition头
#attachment:浏览器将不会对这个文件进行显示,而是作为附件的形式下载
#filename="somefilename.csv":指定这个csv文件的名字
writer = csv.writer(response)
#使用csv模块的writer方法,将相应的数据写入到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 include

urlpatterns = [
path('admin/', admin.site.urls),
path("csv_view/", views.csv_view, name = "csv_view"),
]



向http://127.0.0.1:8000/csv_view发起请求,somefilename.csv文件被下载:

Django从理论到实战(part45)--下载CSV文件_django

打开该文件:

Django从理论到实战(part45)--下载CSV文件_python_02



将​​csv​​文件定义成模板



我们还可以将​​csv​​格式的文件定义成模板,然后使用​​Django​​​内置的模板系统,并给这个模板传入一个​​Context​​​对象,这样模板系统就会根据传入的​​Context​​​对象,生成具体的​​csv​​文件。



首先,我们定义一个模板文件downLoad.html:

{% for row in rows %} {{ row.0 }},{{ row.1 }}
{% endfor %}



在views.py文件中定义一个视图函数:

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_template
return response



向http://127.0.0.1:8000/csv_view发起请求,打开下载后的csv文件:

Django从理论到实战(part45)--下载CSV文件_文件定义_03



生成大的CSV文件



我们可以借助​​StreamingHttpResponse​​对象,这个对象是将响应的数据作为一个流返回给客户端,而不是作为一个整体返回。



首先,我们在views.py文件中添加视图函数:

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 = rows
return response



定义主urls.py文件:

from django.contrib import admin
from django.urls import path
from . import views
from django.conf.urls import include

urlpatterns = [
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发起请求,largeFile.csv文件被下载:

Django从理论到实战(part45)--下载CSV文件_文件定义_04



StreamingHttpResponse类



这个类是专门用来处理流数据的。使得在处理一些大型文件的时候,不会因为服务器处理时间过长而到时连接超时。这个类不是继承自​​HttpResponse​​​,并且跟​​HttpResponse​​对比有以下几点区别:

  • 这个类没有属性​​content​​​,相反是​​streaming_content​​。
  • 这个类的​​streaming_content​​必须是一个可以迭代的对象。
  • 这个类没有​​write​​方法,如果给这个类的对象写入数据将会报错。
  • 注意:​​StreamingHttpResponse​​会启动一个进程来和客户端保持长连接,所以会很消耗资源。所以如果不是特殊要求,尽量少用这种方法。

    【文章转自日本多IP站群服务器 http://www.558idc.com/japzq.html提供,感恩】
    上一篇:Django从理论到实战(part47)--ListView类
    下一篇:没有了
    网友评论