在资源被浏览器缓存的情况下最小化数据库查询(Django 项目)
Minimizing DB queries in cases where the resource is browser cached (Django project)
在我正在开发的 Django Web 应用程序中,有一个页面需要在列表中显示多个用户头像。在相关视图中,我使用 Django ORM 来获取这些 url,如下所示:
Avatar.objects.filter(id__in=user_list).values('id','url)
接下来,我设置了我的 nginx 网络服务器来缓存静态资源,只需通过:
map $sent_http_content_type $expires {
default off;
text/html epoch;
text/css max;
application/javascript max;
~image/ max;
}
我的理解是,每当处理为头像列表页面提供服务的视图时,早期的 Django ORM 查询总是 运行。因此,网络服务器缓存允许我保存 GET 请求,但 不是实际的数据库查找 。这个理解对吗?
如果是这样,仅当图像未缓存在浏览器中时才调用 ORM 查询的模式是什么?这可能(或可取)吗?如果没有,为什么不呢?
我有兴趣了解在此类情况下 Web 开发的最佳实践。说明性的例子会很棒!
在您的情况下,您可能希望保持原样并每次都查询数据库(这没有什么不好的!)
浏览器需要为每个图像获取一个 URL 以检查它是否在其缓存中,而 URL 最终来自数据库。如果必须的话,你可以通过在服务器端缓存查询结果来解决这个问题,但我不建议这样做,除非你有性能问题。此缓存将完全独立于(并且不知道)浏览器缓存。
以下是 more-or-less 我对这个问题的心智模型的步骤 - 希望这对您有所帮助:
- 浏览器 - 向网络服务器发送请求
- Weberver - 获取请求,查询数据库以获取图像 URL
- 数据库 - 回复网络服务器
- 网络服务器 - 用网页回复浏览器
- 浏览器 - 检查其他资源的响应(例如带有 URLs 的 img 标签)
- 浏览器 - 检查这些资源的缓存并在它们被缓存且有效时显示它们
- 浏览器 - 请求它没有从 Imageserver 缓存的资源
- Imageserver - 将图像内容传送到浏览器,包括缓存 headers
- 浏览器 - 显示图像
备注:
Webserver 和Imageserver 可以相同也可以不同。 Imageserver 发送的缓存 headers 是让浏览器缓存它们的重要因素。
您提到您设置了 NGINX 来缓存静态资源。它不是缓存,而是将包含有关缓存说明的 headers 发送到请求资源的浏览器。
在我正在开发的 Django Web 应用程序中,有一个页面需要在列表中显示多个用户头像。在相关视图中,我使用 Django ORM 来获取这些 url,如下所示:
Avatar.objects.filter(id__in=user_list).values('id','url)
接下来,我设置了我的 nginx 网络服务器来缓存静态资源,只需通过:
map $sent_http_content_type $expires {
default off;
text/html epoch;
text/css max;
application/javascript max;
~image/ max;
}
我的理解是,每当处理为头像列表页面提供服务的视图时,早期的 Django ORM 查询总是 运行。因此,网络服务器缓存允许我保存 GET 请求,但 不是实际的数据库查找 。这个理解对吗?
如果是这样,仅当图像未缓存在浏览器中时才调用 ORM 查询的模式是什么?这可能(或可取)吗?如果没有,为什么不呢?
我有兴趣了解在此类情况下 Web 开发的最佳实践。说明性的例子会很棒!
在您的情况下,您可能希望保持原样并每次都查询数据库(这没有什么不好的!)
浏览器需要为每个图像获取一个 URL 以检查它是否在其缓存中,而 URL 最终来自数据库。如果必须的话,你可以通过在服务器端缓存查询结果来解决这个问题,但我不建议这样做,除非你有性能问题。此缓存将完全独立于(并且不知道)浏览器缓存。
以下是 more-or-less 我对这个问题的心智模型的步骤 - 希望这对您有所帮助:
- 浏览器 - 向网络服务器发送请求
- Weberver - 获取请求,查询数据库以获取图像 URL
- 数据库 - 回复网络服务器
- 网络服务器 - 用网页回复浏览器
- 浏览器 - 检查其他资源的响应(例如带有 URLs 的 img 标签)
- 浏览器 - 检查这些资源的缓存并在它们被缓存且有效时显示它们
- 浏览器 - 请求它没有从 Imageserver 缓存的资源
- Imageserver - 将图像内容传送到浏览器,包括缓存 headers
- 浏览器 - 显示图像
备注:
Webserver 和Imageserver 可以相同也可以不同。 Imageserver 发送的缓存 headers 是让浏览器缓存它们的重要因素。
您提到您设置了 NGINX 来缓存静态资源。它不是缓存,而是将包含有关缓存说明的 headers 发送到请求资源的浏览器。