流式响应
经常性的,我们需要在视图函数中,从一个数据源读取数据,处理后再生成响应对象。
如果数据源是随时就绪的,通常我们一次性读取源数据、处理即可。但有两种情况 并不适合采用一次读取的方案:
- 源数据非常大,比如一个相当大的XML文档,一次读进来服务器就DOWN掉了
- 源数据是流式的,不能当时就绪。比如从一个网络地址读取。
Django的StreamingHttpResponse类就是用来处理这种用例的,它接受一个可迭代 的对象作为参数,使用每次迭代返回的字符串,逐步生成响应:
var v_stream(req):
rsp = StreamingHttpResponse(xrange(100))
return rsp
StreamingHttpResponse
如果要发送一个二进制文件,比如图片文件,可以使用FileResponse类,它继承自 StreamingHttpResponse,特别对二进制内容进行了优化。
创建一个FileResponse对象,需要传入一个文件句柄以便迭代:
def v_binfile(req):
rsp = FileResponse(open('test.png','rb'))
return rsp
需要注意的是,应当以二进制模式打开文件:rb。
运行示例代码,思考一下,流式响应适合应用在哪些场景下?