Tastypie:有没有办法在资源更新后使Cache无效?

时间:2017-05-30 10:31:04

标签: django rest caching tastypie

我有一个Django(1.8.17)应用程序,我使用Tastypie(0.13.3)作为REST API框架。 我有一些非常简单的资源,我使用SimpleCache将它们缓存15分钟。

from tastypie.resources import ModelResource
from my_app.models import MyModel
from tastypie.cache import SimpleCache


class MyModelResource(ModelResource):
    cache = SimpleCache(timeout=900)
    class Meta:
        queryset = MyModel.objects.all()

问题:当我通过PUT请求更新资源时,资源会在DataBase中更新,但不会从缓存中失效,所以我继续获取旧数据15分钟,这是不方便,我希望当资源更新时,它将从DB中获取并再次缓存。是否有人面临同样的问题?

1 个答案:

答案 0 :(得分:1)

经过长时间的搜索而没有找到任何东西,我有了一个主意!通过在每次更新时从缓存中删除对象来覆盖PUT方法,这是从头开始应该发生的自然方式。 我发现Tastypie的SimpleCache正在使用Django的核心缓存(至少在这种情况下;想想设置),所以这就是我解决问题的方法:

from tastypie.resources import ModelResource
from my_app.models import MyModel
from tastypie.cache import SimpleCache
from django.core.cache import cache


class MyModelResource(ModelResource):
    cache = SimpleCache(timeout=900)
    class Meta:
        queryset = MyModel.objects.all()

    def put_detail(self, request, **kwargs):
        # Build the key
        key = "{0}:{1}:detail:pk={2}".format(kwargs['api_name'], kwargs['resource_name'], kwargs['pk'])
        cache.delete(key)
        return super(MyModelResource, self).put_detail(request, **kwargs)