2009-11-23 26 views
6

Trong mẫu trang bìa của tôi, tôi sử dụng chức năng bộ nhớ cache như thế này:Làm cách nào để hết hạn khóa bộ đệm mẫu django khi nhận tín hiệu?

{% cache 86400 my_posts %} 
    {% get_latest_posts %} 
{% endcache %} 

Khi có bài viết mới Tôi muốn hết hạn phím cache; như thế này:

def clear_post_cache(): 
    cache.delete('my_posts') 

post_save.connect(clear_post_cache, sender=Post) 

Vấn đề của tôi là không thể truy cập khóa bộ nhớ cache là 'my_posts'. Làm cách nào để tìm tên khóa?

Trả lời

16

Hãy nhìn vào cách khóa bộ nhớ cache là constructed:

args = md5_constructor(u':'.join([urlquote(resolve_variable(var, context)) for var in self.vary_on])) 
cache_key = 'template.cache.%s.%s' % (self.fragment_name, args.hexdigest()) 

Điều quan trọng là sự kết hợp của các tên fragment (my_posts) và một khoản tiền md5 của các đối số bổ sung cho thẻ nhớ cache. Vì bạn không có đối số bổ sung, hexdigest là d41d8cd98f00b204e9800998ecf8427e (hàm băm md5 của chuỗi trống). Do đó, khóa bộ nhớ cache sẽ kết thúc là

template.cache.my_posts.d41d8cd98f00b204e9800998ecf8427e 

Nếu bạn cần giải pháp tổng quát hơn, this snippet có thể hữu ích.

3

Lưu ý rằng md5_constructor trong dòng đầu tiên của ví dụ của Benjamin Wohlwend ở trên không còn được dùng nữa. Phiên bản hiện tại (tháng 11 năm 2011) là:

args = hashlib.md5(u':'.join([urlquote(resolve_variable(var, context)) for var in self.vary_on])) 
2
from django.core.cache import cache 
from django.core.cache.utils import make_template_fragment_key 

cache.delete(make_template_fragment_key('footer')) 
Các vấn đề liên quan