From 1ff2e37e049004852681794537417a1947bf6f18 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 19 Oct 2014 14:19:05 -0500 Subject: Simplify last modified and etags processing for feeds We had this elaborate system set up with caching and invalidation, which is overkill since we cache the result of the view anyway. Just hit the database when needed to find the last change to the respective model class and be done with it. Signed-off-by: Dan McGee --- main/models.py | 6 +----- main/utils.py | 42 ------------------------------------------ 2 files changed, 1 insertion(+), 47 deletions(-) (limited to 'main') diff --git a/main/models.py b/main/models.py index 09b1adc0..1b95f3fa 100644 --- a/main/models.py +++ b/main/models.py @@ -443,12 +443,8 @@ class PackageFile(models.Model): db_table = 'package_files' -# connect signals needed to keep cache in line with reality -from main.utils import refresh_latest -from django.db.models.signals import pre_save, post_save +from django.db.models.signals import pre_save -post_save.connect(refresh_latest, sender=Package, - dispatch_uid="main.models") # note: reporead sets the 'created' field on Package objects, so no signal # listener is set up here to do so pre_save.connect(set_created_field, sender=Donor, diff --git a/main/utils.py b/main/utils.py index 97cc540a..cf156566 100644 --- a/main/utils.py +++ b/main/utils.py @@ -12,11 +12,6 @@ from django.utils.timezone import now from django.template.defaultfilters import slugify -CACHE_TIMEOUT = 1800 -INVALIDATE_TIMEOUT = 10 -CACHE_LATEST_PREFIX = 'cache_latest_' - - def cache_function_key(func, args, kwargs): raw = [func.__name__, func.__module__, args, kwargs] pickled = pickle.dumps(raw, protocol=pickle.HIGHEST_PROTOCOL) @@ -76,43 +71,6 @@ def format_http_headers(request): make_choice = lambda l: [(str(m), str(m)) for m in l] -# These are in here because we would be jumping around in some import circles -# and hoops otherwise. The only thing currently using these keys is the feed -# caching stuff. - -def refresh_latest(**kwargs): - '''A post_save signal handler to clear out the cached latest value for a - given model.''' - cache_key = CACHE_LATEST_PREFIX + kwargs['sender'].__name__ - # We could delete the value, but that could open a race condition - # where the new data wouldn't have been committed yet by the calling - # thread. Instead, explicitly set it to None for a short amount of time. - # Hopefully by the time it expires we will have committed, and the cache - # will be valid again. See "Scaling Django" by Mike Malone, slide 30. - cache.set(cache_key, None, INVALIDATE_TIMEOUT) - - -def retrieve_latest(sender, latest_by=None): - # we could break this down based on the request url, but it would probably - # cost us more in query time to do so. - cache_key = CACHE_LATEST_PREFIX + sender.__name__ - latest = cache.get(cache_key) - if latest: - return latest - try: - if latest_by is None: - latest_by = sender._meta.get_latest_by - latest = sender.objects.values(latest_by).latest(latest_by)[latest_by] - # Using add means "don't overwrite anything in there". What could be in - # there is an explicit None value that our refresh signal set, which - # means we want to avoid race condition possibilities for a bit. - cache.add(cache_key, latest, CACHE_TIMEOUT) - return latest - except sender.DoesNotExist: - pass - return None - - def set_created_field(sender, **kwargs): '''This will set the 'created' field on any object to the current UTC time if it is unset. -- cgit v1.2.3