You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

清空Redis键后Django REST framework仍返回缓存数据问题求助

问题根因

你观察到的现象和Redis侧缓存无关,是浏览器端强缓存导致的:Django原生的cache_page装饰器默认会给GET响应附加Cache-Control头,告知浏览器在缓存有效期内直接读取本地磁盘/内存缓存,不会向后端发送任何请求,所以你清理Redis、甚至关闭Redis服务的操作都不会生效——请求根本没有到达DRF服务器。这个现象是HTTP缓存标准规则下的正常行为,不是DRF或django-redis的故障。

解决方案

方法1:禁用浏览器强缓存(推荐,匹配你的预期需求)

给cache_page装饰器追加缓存控制参数,强制浏览器每次请求都必须到达后端,由后端判断Redis缓存是否有效:

from django.views.decorators.cache import cache_page
from django.utils.decorators import method_decorator

# 此处以给list接口加缓存为例,60*15是缓存有效期15分钟,可按需调整
@method_decorator(cache_page(60 * 15, cache_control={"no_cache": True}), name='list')
class ProductViewSet(ModelViewSet):
    # 你的原有视图逻辑

这里的cache_control={"no_cache": True}会给响应头加上Cache-Control: no-cache,含义是浏览器可以存储响应缓存,但每次使用前必须向后端确认缓存是否有效,不会再直接返回本地缓存。

方法2:搭配协商缓存优化性能

如果希望兼顾性能,可以同时开启DRF的条件请求支持,配合ETag实现协商缓存:

from rest_framework.viewsets import ModelViewSet
from rest_framework.mixins import ConditionalGetMixin

class ProductViewSet(ConditionalGetMixin, ModelViewSet):
    # 原有逻辑

这种模式下浏览器会发送If-None-Match头携带缓存的ETag值,后端如果判断Redis缓存有效且内容未变更,会直接返回304状态码告知浏览器用本地缓存,既保证了数据一致性,也能减少传输开销。

验证方式

你可以临时打开浏览器开发者工具的「网络」标签,勾选「禁用缓存」选项后重新发送请求,此时请求会直接到达后端,能正常返回更新后的数据,即可验证问题根源确实是浏览器本地缓存。

内容的提问来源于stack exchange,提问作者Ryan Aquino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 23:24:03