如何在Django REST中禁用IE11缓存?解决Angular 5 GET请求缓存问题
解决IE11缓存Django REST GET请求的问题
IE11这老伙计对GET请求的缓存执念确实很深,尤其是当响应没有明确的缓存控制头时,它会默认缓存请求结果,直接导致你的Angular 5应用拿到旧数据。下面给你几个在Django REST Framework里实现缓存控制的实用方案:
方案一:全局中间件(适合整个API禁用缓存)
如果你的所有API接口都不想被客户端缓存,最省心的方式是写一个全局中间件,自动给所有GET请求的响应加上禁止缓存的头。
- 在你的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
- 在项目的
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
相关产品推荐
相关产品推荐

