Python 2.6 декоратор с параметром - PullRequest
0 голосов
/ 11 февраля 2012

Я пишу декоратор кеша файловой системы для django. Проблема в том, что когда я декорирую свою функцию этим декоратором и @ register.simple_tag, я получаю, что my_decorated_func принимает ошибку 0 аргументов (когда страница загружается с этим тегом шаблона)

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' %}

выдает ошибку.

Есть предложения? Спасибо!

1 Ответ

0 голосов
/ 12 февраля 2012

Вот решение: pip install decorator, чем

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
...