提示和最佳实践#

缓存很难!它被认为是计算机科学的一大难题。幸运的是,HTTP 规范有助于避免使用陈旧响应带来的失效问题。以下是使用 CacheControl 和 HTTP 缓存时避免出现更微妙问题的建议和最佳实践。

如果您有建议,请在 github 中创建一个新问题,并告知大家您遇到了什么问题以及如何解决。

时区#

请务必记住,服务器报告的时间可能具有时区感知,也可能没有。如果您将 CacheControl 与您控制的服务一起使用,请确保始终如一地使用任何时间戳,尤其是在请求可能跨越时区的情况下。

缓存响应#

我们已尽最大努力确保缓存响应像正常响应一样,但出于一些显而易见的原因,某些方面有所不同。

  • 缓存响应永远不会流式传输

  • 缓存响应的 raw 属性为 None

显然,当您缓存响应时,您已下载了整个正文。因此,永远不会有使用案例来流式传输缓存响应。

考虑到这一点,您应该知道,如果您尝试在网络存储上缓存非常大的响应,您仍然可能在将数据从网络存储传输到您的应用程序时遇到一些延迟。另一个考虑因素是在 FileCache 中存储大型响应。如果您使用 ETag 进行缓存,并且服务器对构成等效请求的内容非常具体,则它可以在您的应用程序上下文中为基本上相同的数据提供许多不同的响应。

查询字符串参数#

如果您正在缓存使用大量查询字符串参数的请求,请考虑对它们进行排序以确保请求被正确缓存。

Requests 支持在请求中将字典和元组列表都作为 param 参数传递。例如

requests.get(url, params=sorted([('foo', 'one'), ('bar', 'two')]))

通过对 params 进行排序,您可以确保缓存键在所有请求中保持一致,并且您正在有效地进行缓存。