在资源被浏览器缓存的情况下最小化数据库查询(Django项目)

时间:2018-03-22 15:52:57

标签: django browser-cache

在我正在开发的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查询。因此,Web服务器缓存允许我保存GET请求,但不是实际的数据库查找。这种理解是否正确?

如果是这样,只有在浏览器中没有缓存图像时,调用ORM查询的模式是什么?这有可能(或可取)吗?如果没有,为什么不呢?

我有兴趣了解这些案例中的Web开发的最佳实践。说明性的例子很棒!

1 个答案:

答案 0 :(得分:0)

在您的情况下,您可能希望保持原样并且每次都查询数据库(并且没有什么不好的!)

浏览器需要为每个图像获取一个URL,以便检查它是否在其缓存中,并且URL最终来自数据库。如果必须,可以通过在服务器端缓存查询结果来解决这个问题,但除非遇到性能问题,否则我不建议这样做。此缓存完全独立于浏览器缓存(并且不知道)。

以下步骤或多或少是我对此问题的心智模型 - 希望这有用:

  1. 浏览器 - 向Webserver发送请求
  2. Weberver - 获取请求,查询DB以获取图片网址
  3. DB - 回复Webserver
  4. 网络服务器 - 使用网页回复浏览器
  5. 浏览器 - 检查其他资源的响应(例如带网址的img标记)
  6. 浏览器 - 检查其缓存中是否有这些资源,并在缓存且有效时显示它们
  7. 浏览器 - 请求尚未从Imageserver缓存的资源
  8. Imageserver - 向浏览器提供图像内容,包括缓存标题
  9. 浏览器 - 显示图像
  10. 注意:

    Webserver和Imageserver可以相同或不同。 Imageserver发送的缓存标头是让浏览器缓存它们的重要标题。

    您提到设置NGINX来缓存静态资源。它不是缓存,而是将包含有关缓存的说明的标头发送到请求资源的浏览器。