django: cache value decorator

1
2
from functools import wraps
from django.core.cache import c
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
def cached_value(key=None, **kwargs):
    """
    key で指定された値をキャッシュから取得して current に渡す
    reset=True が指定されるとキャッシュデータを使わない
    """

    def _cache_controller(original_func):
        @wraps(original_func)
        def _cache_controlled(*args, **kw):
            current = None if kw.get("reset", False) else cache.get(key)
            lastest = original_func(*args, current=current, **kw)
            cache.set(key, lastest)
            return lastest

        return _cache_controlled

    return _cache_controller
1
2
3
4
5
class PurchaseOrder:

    @cached_value(key="webservice_accesstoken")
    def get_accesstoken(self, current=None, reset=False):
        return Token(self.company.credentials).update_token(current)