我的Angular 5应用程序有一些Internet Explorer问题,因为在 IE 11我对django-REST后端的get请求被浏览器缓存。 我发现question建议在响应中添加特殊的缓存控制标头,但是我没有找到一个有效的答案如何使用Django REST。我测试的所有其他浏览器似乎没有问题。
答案 0 :(得分:2)
我遇到了同样的问题。
将“Cache-Control”标题添加到响应中对我有用。
response = Response()
response['Cache-Control'] = 'no-cache'
示例 views.py :
from rest_framework import status
from rest_framework.response import Response
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
def snippet_list(request):
if request.method == 'GET':
snippets = Snippet.objects.all()
serializer = SnippetSerializer(snippets, many=True)
response = Response(serializer.data)
response['Cache-Control'] = 'no-cache'
return response
答案 1 :(得分:2)
也许您可以使用中间件类将Cache-Control
标头添加到所有响应中。
class CacheControlMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
response['Cache-Control'] = 'no-cache'
return response
然后将其连接到settings.py
MIDDLEWARE = [
...
'your.app.CacheControlMiddleware',
...
]
请记住,这将适用于您可能想要或可能不想要的所有视图(所有ModelViewSets)。
如果您只想将其应用于特定的视图集,最好覆盖视图集中的retrieve()
和list()
方法,您可以在其中设置Cache-Control
标题Response
。有关详细信息,请参阅http://www.django-rest-framework.org/api-guide/generic-views/#mixins
答案 2 :(得分:0)
其他答案都有正确的主意,但这是一个稍微完善的解决方案。
def disable_cache_middleware(get_response):
def middleware(request):
response = get_response(request)
response['Cache-Control'] = 'no-cache, no-store, must-revalidate'
return response
return middleware
此处的主要区别在于,标头中还包含no-store
和must-revalidate
。 The Mozilla documentation on the header suggests this combination to prevent browser caching.您可以在此处详细了解额外的标头值。
第二,我只是发现在这种情况下,基于函数的中间件比基于类的解决方案要少一些样板。