2012-02-11 118 views
0

我正在爲django寫文件系統緩存修飾器。問題是,當我裝修我的功能與這個裝飾和@ register.simple_tag我得到my_decorated_func取0參數錯誤(當網頁加載時使用這個模板標籤)Python 2.6裝飾參數

from functools import wraps 

from django.conf import settings 
from django.core.cache import get_cache 
from django.utils.http import urlquote 
from django.utils.hashcompat import md5_constructor 

FILESYSTEM_CACHE_NAME = 'filesystem' 


def filesystem_cache(key_prefix, cache_time=None): 
    """ 
    Caches function based on key_prefix and function args/kwargs. 
    Stores function result in filesystem cache for a certain cache_time. 
    """ 
    if cache_time: 
     FILESYSTEM_CACHE_TIME = cache_time 
    else: 
     FILESYSTEM_CACHE_TIME = settings.CACHES['filesystem'].get('TIMEOUT') 
    def wrapfunc(func): 
     @wraps(func) 
     def wrapper(*args, **kwargs): 
      full_args = list() 
      full_args.extend(args) 
      for k, v in kwargs.items(): 
       full_args.append('%s:%s' % (str(k), str(v))) 
      md5_args = md5_constructor(u':'.join([urlquote(var) for var in full_args])) 
      cache_key = 'template.cache.%s.%s' % (key_prefix, md5_args.hexdigest()) 
      filesystem_cache = get_cache(FILESYSTEM_CACHE_NAME) 
      cached_value = filesystem_cache.get(cache_key) 
      if cached_value: 
       # if cached value exists - return it 
       return cached_value 
      result = func(*args, **kwargs) 
      filesystem_cache.set(cache_key, result, FILESYSTEM_CACHE_TIME) 
      return result 
     return wrapper 
    return wrapfunc 

@register.simple_tag 
@filesystem_cache('countrypages') 
def my_decorated_func(country, date, locale=None): 

調用my_decorated_func與參數從控制檯是好的,但呈現模板:

{% my_decorated_func country todays_date 'en' %} 

給了我一個錯誤。

有什麼建議嗎?謝謝 !

回答

0

這裏是一個解決方案:PIP安裝裝飾,比

def filesystem_cache(key_prefix, cache_time=None): 
    """ 
    Caches function based on key_prefix and function args/kwargs. 
    Stores function result in filesystem cache for a certain cache_time. 
    """ 
    if cache_time: 
     FILESYSTEM_CACHE_TIME = cache_time 
    else: 
     FILESYSTEM_CACHE_TIME = settings.CACHES['filesystem'].get('TIMEOUT') 
    @decorator 
    def wrapfunc(func, *args, **kwargs): 
     full_args = list() 
     full_args.extend(args) 
     for k, v in kwargs.items(): 
      full_args.append('%s:%s' % (str(k), str(v))) 
     md5_args = md5_constructor(u':'.join([urlquote(var) for var in full_args])) 
     cache_key = 'template.cache.%s.%s' % (key_prefix, md5_args.hexdigest()) 
     filesystem_cache = get_cache(FILESYSTEM_CACHE_NAME) 
     cached_value = filesystem_cache.get(cache_key) 
     if cached_value: 
      # if cached value exists - return it 
      return cached_value 
     result = func(*args, **kwargs) 
     filesystem_cache.set(cache_key, result, FILESYSTEM_CACHE_TIME) 
     return result 
    return wrapfunc