Python Web框架Sanic response file_stream() 函数用法和示例

发表时间:2020-02-18

response.file_stream() 功能是 :Sanic 返回文件流给浏览器。这个函数和 file() 都是返回文件,但是它的不同支出是边读边返回,每次返回一定大小的数据,而 file() 是一次性读完整个文件再返回给浏览器。很明显,如果文件很大时,文件流可以大大节省服务器的内存。

Sanic response.file_stream() 函数

response.file_stream() 语法

async def file_stream(
    location,
    status=200,
    chunk_size=4096,
    mime_type=None,
    headers=None,
    filename=None,
    _range=None,
):

response.file_stream() 参数

  • location:响应要返回的文件路径;
  • status:默认 http 状态码200,正常返回不要修改;
  • chunk_size:每次读取文件数据的大小;
  • mime_type: 返回文件的格式;
  • headers:自定义 http 响应头;
  • filename:如果传值则写入响应头headers的 Content-Disposition
  • _range :指定文件的某一部分;

这里面, location 是必需的参数;
可以通过传入 headers 来自定义响应头;
如果没有传入 mime_type 参数,其内部会使用模块 mimetypes mimetypes.guess_type() 函数通过 filename 来获得;
_range 对象需要有四个属性: start, end, size, total 来描述截取文件中的某一部分。

response.file_stream() 返回值

返回一个 StreamingHTTPResponse 类的实例。

response.file_stream() 例子

from sanic import Sanic
from sanic import response


app = Sanic()


@app.route('/file_stream')
async def large_file(request):
    return await response.file_stream(
        './big_file.jpg',
        headers={'X-Serverd-By': 'YuanRenXue Python'}
    )


if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8888)

通过 echo 创建一个假的jpg文件,其内容为“Welcom to 猿人学Python”,再通过 curl 来查看file_stream响应:

echo "Welcom to 猿人学Python" > ./big_file.jpg
curl -i http://127.0.0.1:8888/file_stream

结果如下,可以看到我们自定义的headers X-Serverd-By: YuanRenXue Python


HTTP/1.1 200 OK
Keep-Alive: 5
X-Serverd-By: YuanRenXue Python
Transfer-Encoding: chunked
Content-Type: image/jpeg

Welcom to 猿人学Python

下面是 file() 响应的结果:

HTTP/1.1 200 OK
Connection: keep-alive
Keep-Alive: 5
X-Serverd-By: YuanRenXue Python
Content-Length: 10
Content-Type: image/jpeg

Welcom to 猿人学Python

对比一下两者的响应头headers,注意 file_stream() 多了 Transfer-Encoding ,却少了 Content-Length 。这是因为,以流的形式每次只返回一个chunk,无法知道整个文件的大小。

文章来源互联网,如有侵权,请联系管理员删除。邮箱:417803890@qq.com / QQ:417803890

微配音

Python Free

邮箱:417803890@qq.com
QQ:417803890

皖ICP备19001818号-4
© 2019 copyright www.pythonf.cn - All rights reserved

微信扫一扫关注公众号:

联系方式

Python Free