我开始在Django开始编程并需要你的一些建议。
我的项目是一个包含1000多种产品的目录。每个产品都有一个图像。
我需要优化这些图像的加载时间和管理,我的问题是:我在哪里存储这些图像?在静态文件夹中,在媒体文件夹或其他解决方案中?
我阅读了Django文档并在google上搜索静态文件和媒体文件,但只找到了关于"存储用户上传数据的建议,例如媒体文件夹"中的个人资料图片。但我不知道这个建议是否适用于我的项目,以优化加载时间和管理这些图像文件。
根据您的经验,您对在项目中存储这些图像的最佳方式有何看法?
我正在使用Nginx,DigitalOcean VPS。
谢谢!
答案 0 :(得分:1)
静态文件是主题/皮肤的一部分(“包装”)。这些文件通常不应该更改,应该根据浏览器上次检索它们的时间来提供,并在将来设置得很远:
location /static {
expires max;
}
媒体文件是内容的一部分,而不是网站的包装。图像更改的可能性更大:上传的第一个图片看起来不那么好,制造商提供的介质更好等等。因此,根据修改日期将其过期更有意义:
location /media {
# Optional: if rollbacks are frequent
# if_modified_since before;
expires modified+1w;
}
关于回滚:如果从备份系统或版本控制系统恢复旧版本的映像,您可能需要设置此项。请注意,Django不会将上传图像的修改时间设置为上传者计算机上的修改时间,因此新上传将是新图像,即使它是以前的版本。
现在这里有一个棘手的部分:页面优化工具会告诉你关于图像的过期时间不远,因此会抱怨媒体文件。这是因为在涉及图像时,他们无法区分包装和内容。
另外需要注意的是,在那一周之后,浏览器每次都会请求图像,而nginx在没有更改时会响应304响应。因此,您的页面将生成更多请求。这个和页面优化工具是为什么修改不被用于野外图像的两个原因,而是仅使用第一个策略。为了处理修改后的图像,您将使用相同的资源(产品)关联不同名称的图像,因此内容管理员或中间件层负责将上载的图像重命名为唯一名称。一个简单的技巧是将媒体图像命名为md5或sha1哈希。
即使您为服务媒体和静态应用单个过期策略,我仍然会从不同的目录中为它们提供服务。原因是运行Django的用户不必写入静态文件(仅适用于运行collectstatic管理命令的用户)。这可以防止配置错误或受损的Django用户弄乱静态目录。