This version component reflects the "version" of the StaticContent objects which we cache server-side. If the layout of those objects changes between releases, errors occur when loading them from cache. By using a separate version value, which can be incremented on its own after a change has been made to the StaticContent class, we can avoid loading older cached content and in turn take advantage of these changes faster, without needing to intervene operationally.
50 lines
1.6 KiB
Python
50 lines
1.6 KiB
Python
"""
|
|
Helper functions for caching course assets.
|
|
"""
|
|
from django.core.cache import caches
|
|
from django.core.cache.backends.base import InvalidCacheBackendError
|
|
from opaque_keys import InvalidKeyError
|
|
from xmodule.contentstore.content import STATIC_CONTENT_VERSION
|
|
|
|
# See if there's a "course_assets" cache configured, and if not, fallback to the default cache.
|
|
CONTENT_CACHE = caches['default']
|
|
try:
|
|
CONTENT_CACHE = caches['course_assets']
|
|
except InvalidCacheBackendError:
|
|
pass
|
|
|
|
|
|
def set_cached_content(content):
|
|
"""
|
|
Stores the given piece of content in the cache, using its location as the key.
|
|
"""
|
|
CONTENT_CACHE.set(unicode(content.location).encode("utf-8"), content, version=STATIC_CONTENT_VERSION)
|
|
|
|
|
|
def get_cached_content(location):
|
|
"""
|
|
Retrieves the given piece of content by its location if cached.
|
|
"""
|
|
return CONTENT_CACHE.get(unicode(location).encode("utf-8"), version=STATIC_CONTENT_VERSION)
|
|
|
|
|
|
def del_cached_content(location):
|
|
"""
|
|
Delete content for the given location, as well versions of the content without a run.
|
|
|
|
It's possible that the content could have been cached without knowing the course_key,
|
|
and so without having the run.
|
|
"""
|
|
def location_str(loc):
|
|
"""Force the location to a Unicode string."""
|
|
return unicode(loc).encode("utf-8")
|
|
|
|
locations = [location_str(location)]
|
|
try:
|
|
locations.append(location_str(location.replace(run=None)))
|
|
except InvalidKeyError:
|
|
# although deprecated keys allowed run=None, new keys don't if there is no version.
|
|
pass
|
|
|
|
CONTENT_CACHE.delete_many(locations, version=STATIC_CONTENT_VERSION)
|