学习笔记,仅供参考,有错必纠
参考自:Django打造大型企业官网–Huang Y;
文章目录
- CSV文件
- 生成小的CSV文件
- 将`csv`文件定义成模板
- 生成大的CSV文件
- StreamingHttpResponse类
CSV文件
生成小的CSV文件
首先,我们在项目文件夹的views.py文件中,定义一个视图函数:
import csvfrom 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 adminfrom 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文件被下载:
打开该文件:
将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文件:
生成大的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 adminfrom 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文件被下载:
StreamingHttpResponse类
这个类是专门用来处理流数据的。使得在处理一些大型文件的时候,不会因为服务器处理时间过长而到时连接超时。这个类不是继承自HttpResponse,并且跟HttpResponse对比有以下几点区别:
注意:StreamingHttpResponse会启动一个进程来和客户端保持长连接,所以会很消耗资源。所以如果不是特殊要求,尽量少用这种方法。
【文章转自日本多IP站群服务器 http://www.558idc.com/japzq.html提供,感恩】