Django: 路由与视图 互动版

流式响应

经常性的,我们需要在视图函数中,从一个数据源读取数据,处理后再生成响应对象。

如果数据源是随时就绪的,通常我们一次性读取源数据、处理即可。但有两种情况 并不适合采用一次读取的方案:

  1. 源数据非常大,比如一个相当大的XML文档,一次读进来服务器就DOWN掉了
  2. 源数据是流式的,不能当时就绪。比如从一个网络地址读取。

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

运行示例代码,思考一下,流式响应适合应用在哪些场景下?