Пользовательский декоратор Django с ошибкой cache_page

У меня есть собственный декоратор для представления, и мне нужно кэшировать это представление после обработки некоторых переменных запроса. Мой код декоратора такой

def custom_dec(view_func):
    @wraps(view_func, assigned=available_attrs(view_func))
    def wrapper(request,filters,*args,**kwargs):
        # do some processing on request and filters
        return csrf_exempt(cache_page(900, view_func))
return wrapper

и я применил декоратор как:

@custom_dec
def myview(request,filters,*args,**kwargs):
    # view code here

Проблема в том, что этот код дает мне ошибку при переходе через промежуточное программное обеспечение:

Тип исключения: AttributeError
Значение исключения: объект «функция» не имеет атрибута «код_статуса».

Когда я смотрю на ответ, это функция myview вместо ответа представления.
ответ <function myview at 0xb549e534>

Что не так в моем коде?

ОБНОВЛЕНИЕ: код работает нормально, если я изменю возврат в функции деформации на return view_func, что означает, что я должен делать что-то неправильно при применении декоратора страницы кеша.


person Dhiraj Thakur    schedule 29.08.2013    source источник
comment
Вы возвращаете объект HttpResonse из своего представления? Разместите полный код просмотра здесь как есть.   -  person Srinivas Reddy Thatiparthy    schedule 29.08.2013
comment
@SrinivasReddyThatiparthy: да, код представления работает без этого декоратора.   -  person Dhiraj Thakur    schedule 29.08.2013
comment
Нет. В таком случае это не работает. вам нужно вернуть объект HttpResponse из этого представления, даже если вы кешируете.   -  person Srinivas Reddy Thatiparthy    schedule 29.08.2013
comment
@SrinivasReddyThatiparthy Я не понял, представление отображает шаблон с помощью render_to_response. Я использовал простой декоратор cache(900) в представлении, и это сработало. Этот пользовательский декоратор доставляет мне проблемы.   -  person Dhiraj Thakur    schedule 29.08.2013
comment
Это потому, что вы возвращаете функцию, а не объект ответа.   -  person Denis    schedule 29.08.2013
comment
@Денис: я не понял?   -  person Dhiraj Thakur    schedule 29.08.2013
comment
просто запустите свою функцию, и она должна вернуть объект ответа, который имеет статус_код и другие атрибуты.   -  person Denis    schedule 29.08.2013
comment
@ Денис, я запускаю его, и тогда я получаю эту ошибку.   -  person Dhiraj Thakur    schedule 29.08.2013


Ответы (1)


Оказывается, мне пришлось вернуть объект HttpResponse. Это сработало, когда я изменил код на:

def custom_dec(view_func):
    @wraps(view_func, assigned=available_attrs(view_func))
    def wrapper(request,filters,*args,**kwargs):
        # do some processing on request and filters
        cached_func = cache_page(900, view_func)
        return cached_func(request,filters,*args,**kwargs) #this returns an HttpResponse object
        # the above two line could also be written as cache_page(900, view_func)(request,filters,*args,**kwargs)
return wrapper 
person Dhiraj Thakur    schedule 29.08.2013