如何在Django中为用户提供动态生成的ZIP存档?
我正在做一个网站,在那里用户可以 Select 任何可用的书籍组合,并以ZIP存档的形式下载它们.我担心 for each 请求生成这样的存档会使我的服务器变得非常缓慢.我还听说Django目前没有一个很好的解决方案来服务动态生成的文件.
如何在Django中为用户提供动态生成的ZIP存档?
我正在做一个网站,在那里用户可以 Select 任何可用的书籍组合,并以ZIP存档的形式下载它们.我担心 for each 请求生成这样的存档会使我的服务器变得非常缓慢.我还听说Django目前没有一个很好的解决方案来服务动态生成的文件.
解决方案如下.
使用Python模块zipfile创建zip存档,但作为文件指定StringIO对象(zipfile构造函数需要类文件对象).添加要压缩的文件.然后,在您的Django应用程序中,返回HttpResponse
中的StringIO对象的内容,将mimetype设置为application/x-zip-compressed
(或至少application/octet-stream
).如果您愿意,您可以设置content-disposition
头,但这应该不是必须的.
但是要注意,在每个请求上创建zip存档是个坏主意,这可能会杀死你的服务器(如果存档很大,则不计算超时).性能方面的方法是将生成的输出缓存在文件系统中的某个位置,并仅在源文件发生更改时重新生成.更好的办法是提前准备归档文件(例如,通过cron job),并让您的web服务器像往常一样为它们提供服务.