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

如何在Django REST中禁用IE11缓存?解决Angular 5 GET请求缓存问题

解决IE11缓存Django REST GET请求的问题

IE11这老伙计对GET请求的缓存执念确实很深,尤其是当响应没有明确的缓存控制头时,它会默认缓存请求结果,直接导致你的Angular 5应用拿到旧数据。下面给你几个在Django REST Framework里实现缓存控制的实用方案:

方案一:全局中间件(适合整个API禁用缓存)

如果你的所有API接口都不想被客户端缓存,最省心的方式是写一个全局中间件,自动给所有GET请求的响应加上禁止缓存的头。

  1. 在你的Django应用下新建middleware.py文件,写入以下代码:
from django.utils.deprecation import MiddlewareMixin

class DisableIECachingMiddleware(MiddlewareMixin):
    def process_response(self, request, response):
        # 只针对GET请求设置缓存控制头
        if request.method == 'GET':
            # 核心缓存控制头,覆盖现代浏览器和IE的缓存逻辑
            response['Cache-Control'] = 'no-cache, no-store, must-revalidate'
            # 兼容HTTP 1.0协议(IE11依赖这个)
            response['Pragma'] = 'no-cache'
            # 强制缓存立即过期
            response['Expires'] = '0'
        return response
  1. 在项目的settings.py里,把这个中间件加入到MIDDLEWARE列表中(建议放在靠近顶部的位置,确保它能处理所有响应):
MIDDLEWARE = [
    # 其他中间件(比如SecurityMiddleware、CommonMiddleware)...
    'your_app_name.middleware.DisableIECachingMiddleware',
    # 其他中间件...
]

方案二:视图级别控制(针对特定接口)

如果你只想让部分API接口禁用缓存,可以在对应的视图里手动设置响应头。

对于APIView类视图:

from rest_framework.views import APIView
from rest_framework.response import Response

class YourCustomAPIView(APIView):
    def get(self, request):
        # 你的业务逻辑,比如从数据库取数据
        response_data = {"status": "success", "data": "latest_content"}
        # 创建响应对象并设置缓存头
        response = Response(response_data)
        response['Cache-Control'] = 'no-cache, no-store, must-revalidate'
        response['Pragma'] = 'no-cache'
        response['Expires'] = '0'
        return response

对于ModelViewSet:

可以重写finalize_response方法,统一处理该ViewSet下所有GET请求的响应头:

from rest_framework.viewsets import ModelViewSet
from .models import YourModel
from .serializers import YourModelSerializer

class YourModelViewSet(ModelViewSet):
    queryset = YourModel.objects.all()
    serializer_class = YourModelSerializer

    def finalize_response(self, request, response, *args, **kwargs):
        response = super().finalize_response(request, response, *args, **kwargs)
        if request.method == 'GET':
            response['Cache-Control'] = 'no-cache, no-store, must-revalidate'
            response['Pragma'] = 'no-cache'
            response['Expires'] = '0'
        return response

为什么这些头能生效?

  • Cache-Control: no-cache, no-store, must-revalidate:告诉浏览器不能直接使用缓存,必须向服务器验证,同时完全禁止存储缓存内容
  • Pragma: no-cache:兼容HTTP 1.0协议,IE11对这个头的识别度很高
  • Expires: 0:强制缓存立即过期,避免IE11使用过期缓存

我之前用这些方案帮别人解决过同样的IE11缓存问题,亲测有效。记得测试的时候要清空IE11的现有缓存,不然可能看不到效果哦。

内容的提问来源于stack exchange,提问作者Gurkenkönig

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:00:31