2012-02-11 15 views
0

私はdjango用のファイルシステムキャッシュデコレータを書いています。問題は、私は、このデコレータで自分の機能を飾るとregister.simple_tag @私はmy_decorated_funcは、コンソールからのパラメータでmy_decorated_func呼び出すと、エラー(ページがこのテンプレートタグがロードされている場合)パラメータ付きの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): 

はokです0の引数を取り得るときですが、テンプレートをレンダリングする:

{% my_decorated_func country todays_date 'en' %} 

私にエラーが発生します。

提案がありますか?ありがとう!ここで

答えて

0

は、ソリューションです:

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 
よりも、デコレータをインストールPIP
関連する問題