rows object can only partially be stored in sessions. They lose the reference pointing to the database. Moreover Storage objects may be converted to dict.
You should not store rows in session. You can do session.rows = rows.as_list() and this is safer. You would be caching a list of dictionaries instead of a rows object. On Saturday, 28 July 2012 08:57:06 UTC-5, Annet wrote: > > Hi, > > Thanks for your reply. > > Here's some more code from the function: > > if session.site: > print session.site > if not session.site or session.site[0].nodeID!=session.id: > session.site=db((db.NodeNav.nodeID==session.id)&(db.NodeNav.navID== > db.Nav.id)&\ > > (db.Nav.navbarID==SITENAVBARID)).select(db.NodeNav.ALL,orderby=db.Nav.position) > if session.site: > print session.site[0] > # HERE I CONSTRUCT PART OF A MENU AND SOME UI COMPONENTS > if session.about: > print session.about > if not session.about or session.about[0].NodeNav['nodeID']!=session.id: > session.about=db((db.NodeNav.nodeID==session.id)&(db.NodeNav.navID== > db.Nav.id)&\ > > (db.Nav.navbarID==ABOUTNAVBARID)).select(db.Nav.ALL,db.NodeNav.ALL,orderby=db.Nav.position) > if session.about: > print session.about[0].NodeNav > # HERE I CONSTRUCT PART OF A MENU AND SOME UI COMPONENTS > return dict() > > > The first time I run the code the following lines are written to the > console: > > <Row {'frontend': True, 'navID': 1, 'update_record': <function <lambda> at > 0x15e26c30>, 'createdOn': datetime.datetime(2012, 7, 27, 8, 26, 22), > 'nodeID': 283, 'modifiedOn': datetime.datetime(2012, 7, 27, 8, 26, 22), > 'id': 39, 'delete_record': <function <lambda> at 0x15e265b0>, 'backend': > True}> > <Row {'frontend': True, 'navID': 32, 'update_record': <function <lambda> > at 0x15b26d70>, 'createdOn': datetime.datetime(2012, 7, 27, 10, 18, 17), > 'nodeID': 283, 'modifiedOn': datetime.datetime(2012, 7, 27, 10, 18, 17), > 'id': 76, 'delete_record': <function <lambda> at 0x15b26830>, 'backend': > True}> > > > The second time the code is run I get this: > > [<Row {'frontend': True, 'navID': 1, 'modifiedOn': datetime.datetime(2012, > 7, 27, 8, 26, 22), 'createdOn': datetime.datetime(2012, 7, 27, 8, 26, 22), > 'backend': True, 'nodeID': 283, 'id': 39}>, <Row {'frontend': False, > 'navID': 2, 'modifiedOn': datetime.datetime(2012, 7, 27, 8, 27, 8), > 'createdOn': datetime.datetime(2012, 7, 27, 8, 27, 8), 'backend': True, > 'nodeID': 283, 'id': 40}>, ...] > <Row {'frontend': True, 'navID': 1, 'update_record': <function <lambda> at > 0x15c601f0>, 'createdOn': datetime.datetime(2012, 7, 27, 8, 26, 22), > 'nodeID': 283, 'modifiedOn': datetime.datetime(2012, 7, 27, 8, 26, 22), > 'id': 39, 'delete_record': <function <lambda> at 0x15c60f70>, 'backend': > True}> > [<Row {}>, <Row {}>, <Row {}>, <Row {}>, <Row {}>] > > > So, apparently the join: > > session.about=db((db.NodeNav.nodeID==session.id)&(db.NodeNav.navID== > db.Nav.id)&\ > > (db.Nav.navbarID==ABOUTNAVBARID)).select(db.Nav.ALL,db.NodeNav.ALL,orderby=db.Nav.position) > > doesn't survive being stored in session? > > I hope there is way to get passed this, while my whole application depends > on this function: > > > > > def index(): > if request.args(0)!=session.id or not len(request.args): > redirect(URL('addressbook','router',args=request.args(0))) > else: > if session.site: > print session.site > if not session.site or session.site[0].nodeID!=session.id: > > session.site_menu=session.herotext=session.hero=session.homepage=session.promounit=session.relatednames=\ > > session.socialmedia=session.googlemaps=session.theme=session.customtheme=[] > session.container=session.navbarfixedtop=False > session.site=db((db.NodeNav.nodeID==session.id > )&(db.NodeNav.navID==db.Nav.id)&\ > > (db.Nav.navbarID==SITENAVBARID)).select(db.NodeNav.ALL,orderby=db.Nav.position) > if session.site: > print session.site[0] > session.site_menu=[['home',False,URL('site','index',args= > session.id)]] > for s in session.site: > if s.navID==4 and s.frontend: > session.herotext=db(db.HeroUnitText.nodeID== > session.id).select(db.HeroUnitText.ALL).first() > if s.navID==5 and s.frontend: > session.hero=db(db.HeroUnit.nodeID==session.id > ).select(db.HeroUnit.ALL).first() > if s.navID==6 and s.frontend: > session.homepage=db((db.AboutText.nodeID== > session.id)&(db.AboutText.aboutID==HOMEPAGEID))\ > .select(db.AboutText.ALL).first() > if not session.homepage: > response.flash='Geen home page tekst > beschikbaar' > alert='alert-info' # to set alert class for > flash > if s.navID==7 and s.frontend: > session.promounit=True > if s.navID==8 and s.frontend: > > session.relatednames=db((db.NodeRelatedNames.nodeID==session.id)&\ > > (db.NodeRelatedNames.relatedID==db.Organization.nodeID)&(db.NodeRelatedNames.relatedID==db.Address.nodeID)&\ > (db.Address.addrType==PHYSICALADDR))\ > .select(db.Organization.nodeID, > db.Organization.name,db.Address.ALL,orderby=db.Organization.name) > if s.navID==9 and s.frontend: > session.socialmedia=db((db.NodeSocialMedia.nodeID== > session.id)&\ > (db.NodeSocialMedia.socialMediaID== > db.SocialMedia.id))\ > > .select(db.NodeSocialMedia.ALL,db.SocialMedia.ALL,orderby= > db.SocialMedia.name) > if s.navID==10 and s.frontend: > session.googlemaps=True > if s.navID==12 and s.frontend: > session.theme=db((db.NodeTheme.nodeID==session.id > )&\ > (db.NodeTheme.themeID==db.Theme.id > )).select(db.Theme.ALL).first() > # session because theme results in error in > layout.html > if session.theme: > session.container=session.theme.container > > session.navbarfixedtop=session.theme.navbarFixedTop > if s.navID==13 and s.frontend: > session.customtheme=db(db.CustomTheme.nodeID== > session.id).select(db.CustomTheme.ALL).first() > if session.customtheme: > session.container=session.customtheme.container > > session.navbarfixedtop=session.customtheme.navbarFixedTop > if session.about: > print session.about > if not session.about or session.about[0].NodeNav['nodeID']!= > session.id: > session.about_dropdown=[] > session.about=db((db.NodeNav.nodeID==session.id > )&(db.NodeNav.navID==db.Nav.id)&\ > > (db.Nav.navbarID==ABOUTNAVBARID)).select(db.Nav.ALL,db.NodeNav.ALL,orderby=db.Nav.position) > if session.about: > print session.about[0].NodeNav > for a in session.about: > if a.Nav.id==32 and a.NodeNav.frontend: > session.site_menu.append([T('about'),False,'#']) > else: > session.about_dropdown.append([T(a.Nav.name > ),False,URL(a.Nav.frontendcontroller,a.Nav.function,args=session.id)]) > if not session.cal or session.cal[0].NodeNav['nodeID']!=session.id > : > > session.calendar_dropdown=session.hours=session.promohomepage=[] > session.tab_1=session.tab_2=session.tab_3=False > session.cal=db((db.NodeNav.nodeID==session.id > )&(db.NodeNav.navID==db.Nav.id)&\ > > (db.Nav.navbarID==CALENDARNAVBARID)).select(db.Nav.ALL,db.NodeNav.ALL,orderby=db.Nav.position) > if session.cal: > for c in session.cal: > if c.Nav.id==41 and c.NodeNav.frontend: > session.site_menu.append([T('calendar'),False,'#']) > if c.Nav.id==42 and c.NodeNav.frontend: > calendarDropdown(c) > session.openinghours=True > weekday=request.now.weekday()+1 > session.hours=db((db.OpeningHours.nodeID== > session.id)&(db.OpeningHours.dayID==weekday))\ > > .select(db.OpeningHours.ALL,orderby=db.OpeningHours.startTime) > else: > response.flash_hours='Geen informatie over > openingstijden beschikbaar' > if c.Nav.id==43 and c.NodeNav.frontend: > calendarDropdown(c) > session.tab_2=True > if c.Nav.id==44 and c.NodeNav.frontend: > calendarDropdown(c) > session.tab_1=True > if c.Nav.id==45 and c.NodeNav.frontend: > calendarDropdown(c) > session.tab_3=True > if session.tab_1: > tab='tab-1' > elif session.tab_2: > tab='tab-2' > elif session.tab_3: > tab='tab-3' > else: > session.promohomepage=generatePromoUnit(HOMEPAGEID) > if not session.promohomepage: > response.flash_promounits='Geen promo units > beschikbaar' > response.view='site/index.html' > return dict(tab=tab) > > > > Kind regards, > > Annet > --