我需要一些关于静态和媒体文件的建议

I need some advice about static and media files

我开始使用 Django 编程,需要您的一些建议。

我的项目是一个包含 1000 多个产品的目录。每个产品都有一张图片。

我需要优化这些图片的加载时间和管理,我的问题是:我应该在哪里存储这些图片?在静态文件夹、媒体文件夹或其他解决方案中?

我阅读了 Django 文档并在 google 上搜索了静态文件和媒体文件,但只在 "store user uploaded data such profile image in Media folder" 上找到了建议。但我不知道此建议是否适用于我的项目以优化这些图像文件的加载时间和管理。

根据您的经验,您对在我的项目中存储这些图像的最佳方式有何看法?

我正在使用 Nginx、DigitalOcean VPS。

谢谢!

静态文件是主题/皮肤的一部分 ("packaging")。这些文件通常不应更改,应根据浏览器上次检索它们的时间提供服务,并在将来设置得更早:

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 用户破坏静态目录。