Sorry, didn't realize you were trying to decorate a method. cache.action is 
designed to cache controller actions, so it is not expecting to decorate 
any functions that take arguments (methods always take at least the self 
argument).

On Wednesday, August 1, 2018 at 4:27:02 AM UTC-4, Joe Barnhart wrote:
>
> Ah, well.  It seems a bit beyond me.  I think it's failing because I'm 
> caching a bound instance method (i.e. has "self").  I get "wrapped+_f takes 
> no arguments, 1 given)".
>
> def lazy_cache_action(time_expire=DEFAULT_TIME_EXPIRE, cache_model=None,
>            prefix=None, session=False, vars=True, lang=True,
>            user_agent=False, public=True, valid_statuses=None,
>            quick=None):
>     def decorator(f, time_expire=time_expire, cache_model=cache_model, 
> prefix=prefix, 
>             session=session, vars=vars, lang=lang, user_agent=user_agent, 
> public=public, 
>             valid_statuses=valid_statuses, quick=quick):
>         def g(*c, **d):
>             from gluon import current
>             return current.cache.action(time_expire, cache_model, prefix, 
> session, 
>                 vars, lang, user_agent, public, valid_statuses, 
> quick)(f)(*c, **d)
>         g.__name__ = f.__name__
>         return g
>     return decorator
>
>
>
>
> On Wednesday, August 1, 2018 at 12:50:12 AM UTC-7, Joe Barnhart wrote:
>>
>> Oops, I meant of course;
>>
>> current.cache.action
>>
>> instead of
>>
>> current.cache
>>
>>
>>
>>
>> On Wednesday, August 1, 2018 at 12:48:00 AM UTC-7, Joe Barnhart wrote:
>>>
>>> You're a fountain of ideas!  I missed that one in the book.
>>>
>>> I wonder if this would work.  Off to go try it...
>>>
>>> def lazy_cache_action(self, time_expire=DEFAULT_TIME_EXPIRE, 
>>> cache_model=None,
>>>            prefix=None, session=False, vars=True, lang=True,
>>>            user_agent=False, public=True, valid_statuses=None,
>>>            quick=None):
>>>     def decorator(f, time_expire, cache_model, prefix, session, vars, 
>>> lang,
>>>                user_agent, public, valid_statuses, quick):
>>>         def g(*c, **d):
>>>             from gluon import current
>>>             return current.cache(f, time_expire, cache_model, prefix, 
>>> session, vars,
>>>                 lang, user_agent, public, valid_statuses, quick)(f)(*c, 
>>> **d)
>>>         g.__name__ = f.__name__
>>>         return g
>>>     return decorator
>>>
>>>
>>>
>>> On Tuesday, July 31, 2018 at 11:25:10 AM UTC-7, Anthony wrote:
>>>>
>>>> On Tuesday, July 31, 2018 at 1:57:46 AM UTC-4, Joe Barnhart wrote:
>>>>>
>>>>> I was wondering about this.  I tried to search the group but didn't 
>>>>> find anything relevant.  Took a look at the source code and it seemed 
>>>>> like 
>>>>> I could use in a module which is called to produce a string of Javascript 
>>>>> on demand of an Ajax routine.
>>>>>
>>>>> Beforehand, I save the global "cache" var in my "current" object. 
>>>>>  Then I rename my method "content" to "__content__", and last I do this:
>>>>>
>>>>>     def content(self):
>>>>>         c = current.cache
>>>>>         return c.action(cache_model=c.disk, 
>>>>> quick="VP")(self.__content__)()
>>>>>
>>>>> Seems to work.  Am I asking for trouble?  Is there anything I should 
>>>>> watch for?
>>>>>
>>>>
>>>> Seems reasonable. You could also create a custom decorator, similar to 
>>>> lazy_cache 
>>>> <https://github.com/web2py/web2py/blob/master/gluon/cache.py#L728-L746> 
>>>> (see the end of this section: 
>>>> http://web2py.com/books/default/chapter/29/04/the-core#Warning--Do-not-use-the-current-object-in-global-scope-in-a-module
>>>> ).
>>>>
>>>> Anthony
>>>>
>>>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to