标签:lock else iter 前端 ons ocs 响应 迭代器 通过
开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了。我们认为这样的经验是有必要记录下来的,因此就有了【技术博客】。
在VisualPytorch项目中,当时需要提供一个文件下载的功能。最初想到的方案主要有一下三种
这个方案经过查找资料发现不同浏览器的同源策略以及安全策略不尽相同,难以实现,放弃。
这是最开始的思路,后来根据实际需求认为目前服务器性能本身就有限,加上目前项目对文件需求比较简单,不需要复杂的文件服务。
最终采用的实现方法,比较简单好实现。
关于文件打包,在实现时使用了zipfile这个python包
zipf = zipfile.ZipFile("project_VisualPytorch.zip", 'w',zipfile.ZIP_DEFLATED)
关于zipfile的使用详情请见https://docs.python.org/3/library/zipfile.html
服务器后台是通过构造Http的response对象向前端发送数据的,对于较大的文件传输来说,这里推荐使用Django框架中的StreamingHttpResponse或FileResponse构造响应对象。
StreamingHttpResponse采用流式传输文件,参数是一个迭代器,对文件进行分片传输,实现如下
response = StreamingHttpResponse(file_iterator("project_VisualPytorch.zip"))
response['Content-Type'] = 'application/zip'
response['Content-Disposition'] = 'attachment;filename="project_VisualPytorch.zip"'
return response
迭代器构造如下
def file_iterator(file_name, chunk_size=512):
with open(file_name, 'rb') as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
这里设置分片大小为512。
FileResponse是StreamingHttpResponse的子类,使用了缓存等技术,某些情况下优于其父类。
标签:lock else iter 前端 ons ocs 响应 迭代器 通过
原文地址:https://www.cnblogs.com/1606-huluwa/p/10990956.html