【发布时间】:2021-11-17 19:23:22
【问题描述】:
上下文:使用方法装饰器 cache_page 在 Django REST 框架 (DRF) 中通过 redis ModelViewSet API 视图缓存时遇到问题。
文档参考:https://www.django-rest-framework.org/api-guide/caching/
代码片段:https://hastebin.com/apoqeloyav.py
示例场景
这是当前行为(使用 Swagger UI 手动测试)
-
向 /products 端点发送 GET 请求 -> 这将请求我的 DRF 服务器并缓存视图
-
再次向 /products 端点发送 GET 请求 -> 这会将产品数据作为缓存数据响应(已在开发工具网络选项卡“从磁盘缓存提供服务”中验证)。这也意味着它没有访问我的 DRF 服务器来检索数据。
-
向 /products/{product_id} 端点发送 PATCH 请求 -> 这将更新详细信息然后使缓存无效(此时 Redis 缓存键为空)
-
再次向 /products 端点发送 GET 请求 -> 这仍会将产品数据作为缓存数据响应(已验证,因为执行步骤 3 的更新数据仍然不存在)。这也意味着它没有访问我的 DRF 服务器来检索数据。
这是我的预期行为(使用 Swagger UI 手动测试)
- 向 /products 端点发送 GET 请求 -> 这将请求我的 DRF 服务器并缓存视图
- 再次向 /products 端点发送 GET 请求 -> 这会将产品数据作为缓存数据响应(在开发工具网络选项卡“从磁盘缓存提供服务”中验证)。这也意味着它没有访问我的 DRF 服务器来检索数据。
- 向 /products/{product_id} 端点发送 PATCH 请求 -> 这将更新详细信息然后使缓存无效(此时 Redis 缓存键为空)
- 再次向 /products 端点发送 GET 请求 -> 这应该响应来自数据库的产品数据。这意味着它会访问我的 DRF 服务器以检索更新的数据。
如何获得预期的结果,以便如果 redis 缓存为空,它应该访问我的 DRF 服务器以检索最新数据并缓存后续调用,直到它再次失效?另外,我不确定这是一个问题,还是只是正常行为。
这是我迄今为止在从 redis 中使缓存数据无效时尝试的方法,但它们都不起作用并且仍然提供缓存数据
- 将缓存过期时间设置为 0
- 将缓存值设置为无
- 以编程方式删除所有键
- 通过 redis-cli 删除所有键
- 关闭 redis-server -> 但仍为
from disk cache提供服务,并且没有访问我的 DRF API 端点
这是我正在使用的版本
- djangorestframework==3.11.0
- Django==3.0.8
- redis==3.5.3
- drf-yasg==1.17.1 -> 这是 Swagger UI 文档
- django-redis==5.0.0
【问题讨论】:
标签: caching django-rest-framework redis