文章摘自北京理工大学嵩天老师的mooc
Django的响应类型
次性响应 vs 流式响应
一次性响应
• HttpResponse类及子类
• JsonResponse类
流式响应
• StreamingHttpResponse类
• FileResponse类
流式响应常用于:大文本文件传输,大二进制文件传输.
实例:文件下载
(1) HttpResponse方式
文件内容一次性响应,仅适合小文件
def file_download(request):
# do something...
with open('data.txt') as f:
c = f.read()
return HttpResponse(c)
(2) StreamingHttpResponse方式
• 将文件分段,每次传输一部分,分段大小可调
• 利用Python的迭代器产生分段
• 可以是文件,也可以是任何大规模数据响应
实例:文件下载
from django.http import StreamingHttpResponse
def big_file_download(request):
# do something...
def file_iterator(file_name, chunk_size=512):
with open(file_name) as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
fname = "data.txt"
response = StreamingHttpResponse(file_iterator(fname))
yield关键字
包含yield语句的函数是一个生成器(迭代器的一种)
yield 生成器
生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值
生成器是一个不断产生值的函数
(3) FileResponse方式
FileResponse是StreamingHttpResponse的子类
自动分段、自动迭代,适合二进制文件传输
def homeproc2(request):
cwd = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
response = FileResponse(open(cwd + "/msgapp/templates/PyLogo.png", "rb"))
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="pylogo.png"'
return response
MIME标记
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="pylogo.png"'
• Content-Type用于指定文件类型
• Content-Disposition用于指定下载文件的默认名称
• 这两者是MIME类型的标准定义