# HG changeset patch # User Tero Marttila # Date 1378559734 -10800 # Node ID 656c8ff72f7741a19f59e386943c54a51dc36b6c # Parent adddd20cec754d5be4028b0de24b88425a2f5e2b caching for item view diff -r adddd20cec75 -r 656c8ff72f77 qrurls/models.py --- a/qrurls/models.py Sat Sep 07 16:00:13 2013 +0300 +++ b/qrurls/models.py Sat Sep 07 16:15:34 2013 +0300 @@ -189,7 +189,11 @@ ordering = ['published'] @classmethod - def get_item (cls, shorturl, item_id=None, related=()) : + def cache_key (cls, shorturl, item_id) : + return 'qrurls/url/{shorturl}/{item}'.format(shorturl=shorturl, item=item_id) + + @classmethod + def get (cls, shorturl, item_id=None, related=()) : """ Return the URLItem for a given shorturl, either the given specific one, or the latest, from the database. @@ -213,7 +217,6 @@ if item_id : # specific, but still the published on - item_id = int(item_id) log.debug("search @ %d", item_id) return url_item.get(id=item_id) # raises DoesNotExist @@ -237,19 +240,49 @@ get = cache.get(key) if get : - url, modified = get - log.debug("get cache: %s: %s", key, url) + log.debug("get cache: %s", key) + return get else: # from db - url_item = cls.get_item(shorturl=shorturl) + url_item = cls.get(shorturl=shorturl) + set = ( + url_item.get_absolute_url(), + url_item.last_modified() + ) + + log.debug("set cache: %s", key) + cache.set(key, set) + return set - url = url_item.get_absolute_url() - modified = url_item.last_modified() - - log.debug("set cache: %s: %s", key, url) - cache.set(key, (url, modified)) # XXX: expiry - - return url, modified + @classmethod + def get_item (cls, shorturl, item_id) : + """ + Return a data dict for the given URLItem, from cache or DB. + + Returns { url: str, title: str, image: str, last_modified: datetime } + Raises URLItem.NotFound + """ + + key = cls.cache_key(shorturl, item_id) + get = cache.get(key) + + if get: + log.debug("cache get: %s", key) + return get + else: + url_item = URLItem.get(shorturl, item_id=item_id, + related=('shorturl', 'image'), + ) + set = dict( + url = url_item.url, + title = url_item.title(), + image = url_item.image.get_absolute_url() if url_item.image else None, + last_modified = url_item.last_modified(), + ) + + log.debug("cache set: %s: %s", key, set) + cache.set(key, set) + return set def get_absolute_url (self) : if self.url : @@ -309,4 +342,7 @@ log.info("clear cache: %s: %s", instance, key) cache.delete(key) + key = URLItem.cache_key(instance.shorturl.shorturl, instance.id) + log.info("clear cache: %s: %s", instance, key) + cache.delete(key) diff -r adddd20cec75 -r 656c8ff72f77 qrurls/views.py --- a/qrurls/views.py Sat Sep 07 16:00:13 2013 +0300 +++ b/qrurls/views.py Sat Sep 07 16:15:34 2013 +0300 @@ -42,26 +42,21 @@ """ Frontend for a specific item. """ - - try : - url_item = URLItem.get_item(shorturl, item_id=item_id, - related=('shorturl', 'image'), - ) + + try: + data = URLItem.get_item(shorturl, int(item_id)) except URLItem.DoesNotExist: raise Http404() - if url_item.url : - response = HttpResponseRedirect(url_item.url) - elif url_item.image : - response = render(request, 'qrurls/image.html', dict( - title = url_item.title(), - image = url_item.image.get_absolute_url(), - )) + if data['url'] : + response = HttpResponseRedirect(data['url']) + elif data['image'] : + response = render(request, 'qrurls/image.html', data) else : raise Http404() # set cache response['Vary'] = '' - response['Last-Modified'] = http_datetime(url_item.last_modified()) + response['Last-Modified'] = data['last_modified'] return response