Django中如何实现文件下载功能

=Start=

缘由:

学习、整理一下最近看到的知识点,方便以后参考。

正文:

参考解答:
方法一(直接HttpResponse返回文件内容):

&

方法二(使用StreamingHttpResponse返回文件内容):

方法三(使用FileResponse返回文件内容):

方法四(添加上「Content-Type」和「Content-Disposition」header字段):

方法五(先让Django做权限判断,然后让静态服务器处理下载):

不管怎么样,使用Django来处理大文件下载都不是一个很好的注意,最好的办法是Django做权限判断,然后让静态服务器处理下载。

这需要使用sendfile的机制:“传统的Web服务器在处理文件下载的时候,总是先读入文件内容到应用程序内存,然后再把内存当中的内容发送给客户端浏览器。这种方式在应付当今大负载网站会消耗更多的服务器资源。sendfile是现代操作系统支持的一种高性能网络IO方式,操作系统内核的sendfile调用可以将文件内容直接推送到网卡的buffer当中,从而避免了Web服务器读写文件的开销,实现了“零拷贝”模式。”

Apache服务器里需要mod_xsendfile模块来实现,而Nginx是通过称为X-Accel-Redirect的特性来实现。

nginx配置文件:

Django中:

这样当向Django view函数发起request时,Django负责对用户权限进行判断或者做些其它事情,然后向nginx转发url为/protected_files/filename的请求,nginx服务器负责文件/var/www/protected_files/filename的下载:

*「方法五」暂未实际测试*,先记录至此供参考。

 

参考链接:

=END=

声明: 除非注明,ixyzero.com文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://ixyzero.com/blog/archives/3925.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注