Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 有没有办法在资源更新后使缓存失效?_Django_Rest_Caching_Tastypie - Fatal编程技术网

Django 有没有办法在资源更新后使缓存失效?

Django 有没有办法在资源更新后使缓存失效?,django,rest,caching,tastypie,Django,Rest,Caching,Tastypie,我有一个Django(1.8.17)应用程序,我使用Tastypie(0.13.3)作为RESTAPI框架。 我有一些非常简单的资源,我使用SimpleCache将它们缓存15分钟 from tastypie.resources import ModelResource from my_app.models import MyModel from tastypie.cache import SimpleCache class MyModelResource(ModelResource):

我有一个Django(1.8.17)应用程序,我使用Tastypie(0.13.3)作为RESTAPI框架。 我有一些非常简单的资源,我使用
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
请求更新资源时,资源在数据库中得到更新,但不会从缓存中失效,因此我继续获取旧数据15分钟,这很不方便,我希望当资源得到更新时,它将从数据库中获取并再次缓存。有没有人面临同样的问题?

经过长时间的搜索,什么也没找到,我有了一个主意!重写
PUT
方法,每次更新对象时只从缓存中删除对象,这是从一开始就应该发生的自然方式。 我发现Tastypie的SimpleCache使用的是Django的核心缓存(至少在本例中是这样;think settings),所以我就是这样解决这个问题的:

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)

@e4c5可能重复不,不是。是因为包不同,但核心问题和解决方案是相同的same@e4c5不,核心问题不一样,解决方案也不是很有用。我深入研究了Tastypie和Django缓存,找到了一个高效而简单的解决方案!然后发布或删除问题