See http://web2py.com/books/default/chapter/29/06#Caching-selects. Have you tried:
db(query).select(..., cacheable=True) Anthony On Thursday, June 20, 2013 10:02:44 AM UTC-4, Quint wrote: > > Hi, > > I am using GAE (dev server) and i am unable to cache Row objects. > For some reason they cannot be pickled. > When a convert it to dicts everything works fine, but then i am unable to > work with web2py Rows. > > This is a related post: > https://groups.google.com/forum/#!msg/web2py/SbJGKMRyeT8/BNybB-znFQgJ > > I tried 2 different ways and below i copied the errors. The first is when > using my own caching mechanism in which i pickle the data myself and > directly use GAE memcache. > The second is when i use "@cache.action" > * > * > *Pickle by me* > ========= > > Traceback (most recent call last): > > File "C:\Users\****************\gluon\restricted.py", line 212, in > restricted > exec ccode in environment > File "C:\Users\****************\applications\init\controllers/api.py", > line 401, in <module> > File "C:\Users\****************\gluon\globals.py", line 194, in <lambda> > self._caller = lambda f: f() > File "C:\Users\****************\gluon\globals.py", line 158, in f > return rest_action(*_self.args, **_self.vars) > File "C:\Users\****************\applications\init\controllers/api.py", > line 346, in GET > return get(get_articles, use_etag, t, categories=c, channel=ch) > File "C:\Users\****************\applications\init\controllers/api.py", > line 259, in get > cached_response = pickle.dumps(cached_response) > File "C:\Python\Python273_X86\Lib\pickle.py", line 1374, in dumps > Pickler(file, protocol).dump(obj) > File "C:\Python\Python273_X86\Lib\pickle.py", line 224, in dump > self.save(obj) > File "C:\Python\Python273_X86\Lib\pickle.py", line 331, in save > self.save_reduce(obj=obj, *rv) > File "C:\Python\Python273_X86\Lib\pickle.py", line 401, in save_reduce > save(args) > File "C:\Python\Python273_X86\Lib\pickle.py", line 286, in save > f(self, obj) # Call unbound method with explicit self > File "C:\Python\Python273_X86\Lib\pickle.py", line 562, in save_tuple > save(element) > File "C:\Python\Python273_X86\Lib\pickle.py", line 286, in save > f(self, obj) # Call unbound method with explicit self > File "C:\Python\Python273_X86\Lib\pickle.py", line 649, in save_dict > self._batch_setitems(obj.iteritems()) > File "C:\Python\Python273_X86\Lib\pickle.py", line 663, in _batch_setitems > save(v) > File "C:\Python\Python273_X86\Lib\pickle.py", line 286, in save > f(self, obj) # Call unbound method with explicit self > File "C:\Python\Python273_X86\Lib\pickle.py", line 649, in save_dict > self._batch_setitems(obj.iteritems()) > File "C:\Python\Python273_X86\Lib\pickle.py", line 663, in _batch_setitems > save(v) > File "C:\Python\Python273_X86\Lib\pickle.py", line 286, in save > f(self, obj) # Call unbound method with explicit self > File "C:\Python\Python273_X86\Lib\pickle.py", line 600, in save_list > self._batch_appends(iter(obj)) > File "C:\Python\Python273_X86\Lib\pickle.py", line 615, in _batch_appends > save(x) > File "C:\Python\Python273_X86\Lib\pickle.py", line 331, in save > self.save_reduce(obj=obj, *rv) > File "C:\Python\Python273_X86\Lib\pickle.py", line 419, in save_reduce > save(state) > File "C:\Python\Python273_X86\Lib\pickle.py", line 286, in save > f(self, obj) # Call unbound method with explicit self > File "C:\Python\Python273_X86\Lib\pickle.py", line 649, in save_dict > self._batch_setitems(obj.iteritems()) > File "C:\Python\Python273_X86\Lib\pickle.py", line 663, in _batch_setitems > save(v) > File "C:\Python\Python273_X86\Lib\pickle.py", line 331, in save > self.save_reduce(obj=obj, *rv) > File "C:\Python\Python273_X86\Lib\pickle.py", line 401, in save_reduce > save(args) > File "C:\Python\Python273_X86\Lib\pickle.py", line 286, in save > f(self, obj) # Call unbound method with explicit self > File "C:\Python\Python273_X86\Lib\pickle.py", line 562, in save_tuple > save(element) > File "C:\Python\Python273_X86\Lib\pickle.py", line 300, in save > self.save_global(obj) > File "C:\Python\Python273_X86\Lib\pickle.py", line 748, in save_global > (obj, module, name)) > PicklingError: Can't pickle <class 'gluon.dal.article'>: it's not found as > gluon.dal.article > > > *@cache.action* > =========== > > Traceback (most recent call last): > File "C:\Users\****************\gluon\restricted.py", line 212, in > restricted > exec ccode in environment > File "C:\Users\****************\applications\init\controllers/api.py", > line 403, in <module> > File "C:\Users\****************\gluon\globals.py", line 194, in <lambda> > self._caller = lambda f: f() > File "C:\Users\****************\gluon\cache.py", line 505, in wrapped_f > rtn = cache_model(cache_key, lambda : func(), time_expire=time_expire) > File "C:\Users\****************\gluon\contrib\gae_memcache.py", line 40, > in __call__ > self.client.set(key, (time.time(), value)) > File "C:\Program Files > (x86)\Google\google_appengine\google\appengine\api\memcache\__init__.py", > line 773, in set > namespace=namespace) > File "C:\Program Files > (x86)\Google\google_appengine\google\appengine\api\memcache\__init__.py", > line 878, in _set_with_policy > time, '', namespace) > File "C:\Program Files > (x86)\Google\google_appengine\google\appengine\api\memcache\__init__.py", > line 957, in _set_multi_async_with_policy > stored_value, flags = _validate_encode_value(value, self._do_pickle) > File "C:\Program Files > (x86)\Google\google_appengine\google\appengine\api\memcache\__init__.py", > line 227, in _validate_encode_value > stored_value = do_pickle(value) > File "C:\Program Files > (x86)\Google\google_appengine\google\appengine\api\memcache\__init__.py", > line 399, in _do_pickle > pickler.dump(value) > TypeError: 'NoneType' object is not callable > > > Does anyone know whats going on here? > > Thanks! > -- --- 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 [email protected]. For more options, visit https://groups.google.com/groups/opt_out.

