【问题标题】:Expiring a view-cache in Django 1.3.1使 Django 1.3.1 中的视图缓存过期
【发布时间】:2012-05-14 09:19:02
【问题描述】:

我正在尝试使模型的post_save(通过https://docs.djangoproject.com/en/1.3/topics/cache/?from=olddocs#the-per-view-cache 设置)上的视图级缓存过期。我做了一些谷歌搜索,并在 SO:Expire a view-cache in Django? 上找到了这个答案,但这对我不起作用。

我在 freenode 的 #django 房间四处询问,一致认为这可能是由于 the recent caching changes made in 1.3

有没有人知道如何清除以get_absolute_url() 为键的模型的缓存条目?

【问题讨论】:

  • 如果ilvar's answer 与您的解决方案足够接近,请接受它。否则,请发布自己的答案并尽快接受,如果有帮助,请至少支持 ilvar 的答案。
  • 好的,谢谢@glglgl...仍在学习这里的工作原理。 :) 我只是将我的解决方案从问题的主体中移到了它自己的答案中。

标签: python django caching django-views


【解决方案1】:

Django 的缓存中间件使用this 为请求生成缓存键。因此,您可以使用所需的路径制作一个假的request 并获取一个缓存键。然后只需将其从缓存中删除即可。

附: cache_page 装饰器也使用该中间件,因此它应该以相同的方式工作。

【讨论】:

    【解决方案2】:

    我想通了!

    感谢ilvar 为我指明了正确的方向。我的实现如下。我创建了一个名为cache_key 的属性,并在模型的子类中添加了一个 post_save 接收器,我需要在更新后清除其视图级缓存。欢迎提出改进建议!

    from django.conf import settings
    from django.core.cache import cache
    from django.db.models.signals import post_save
    from django.http import HttpRequest
    from django.utils.cache import _generate_cache_header_key
    
    from someapp.models import BaseModelofThisClass
    
    class SomeModel(BaseModelofThisClass):
        ...
        @property
        def cache_key(self):
            # Create a fake request object
            request = HttpRequest()
            # Set the request method
            request.method = "GET"
            # Set the request path to be this object's permalink.
            request.path = self.get_absolute_url()
            # Grab the key prefix (if it exists) from settings
            key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
            # Generate this object's cache key using django's key generator
            key = _generate_cache_header_key(key_prefix, request)
            # This is a bit hacky but necessary as I don't know how to do it
            # properly otherwise. While generating a cache header key, django
            # uses the language of the HttpRequest() object as part of the
            # string. The fake request object, by default, uses
            # settings.LANGUAGE_CODE as it's language (in my case, 'en-us')
            # while the true request objects that are used in building views
            # use settings.LANGUAGES ('en'). Instead of replacing the segment
            # of the string after the fact it would be far better create a more
            # closely mirrored HttpRequest() object prior to passing it to
            # _generate_cache_header_key().
            key = key.replace(settings.LANGUAGE_CODE, settings.LANGUAGES[settings.DEFAULT_LANGUAGE][0])
    
            return key
    
        @receiver(post_save)
        def clear_cache_for_this_item(sender, instance, **kwargs):
            # If this is a sub-class of another model
            if sender not in BaseModelofThisClass.__subclasses__():
                return
            else:
                cache.delete(instance.cache_key)
    

    【讨论】:

      猜你喜欢
      • 2011-01-17
      • 1970-01-01
      • 2012-10-12
      • 2013-08-18
      • 2015-10-20
      • 2010-10-19
      • 2012-04-24
      • 2012-03-10
      • 2011-09-26
      相关资源
      最近更新 更多