Django的视图流式响应机制

文章介绍了Django的响应类型,包括一次性响应和流式响应。一次性响应有HttpResponse类及子类、JsonResponse类;流式响应有StreamingHttpResponse类、FileResponse类,常用于大文件传输。还给出文件下载实例,介绍了不同方式特点及MIME标记。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章摘自北京理工大学嵩天老师的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类型的标准定义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值