如何在django REST中禁用IE11缓存

时间:2018-03-11 14:17:42

标签: django django-rest-framework

我的Angular 5应用程序有一些Internet Explorer问题,因为在 IE 11我对django-REST后端的get请求被浏览器缓存。 我发现question建议在响应中添加特殊的缓存控制标头,但是我没有找到一个有效的答案如何使用Django REST。我测试的所有其他浏览器似乎没有问题。

3 个答案:

答案 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-storemust-revalidateThe Mozilla documentation on the header suggests this combination to prevent browser caching.您可以在此处详细了解额外的标头值。

第二,我只是发现在这种情况下,基于函数的中间件比基于类的解决方案要少一些样板。