I'm trying to implement the viewScope variables for web2py controller
methods. Idea behind is to mimic a behaviour of JAVA frameworks like JSF or
Spring that use the concept of viewScope variables. Such variables live
during the all posts to same controller action / to the same form. This is
very handy when one is doing some heavy form actions or wizard actions etc.
that we do all the time in corporate development. Using the viewScope
variable one can avoid using a hidden fields (which using is rather a
security issue as user can easily change the value in browser using dev
tools.)
Now my idea expressed in code snippet below is to generate UUID value
during the get request (the first request to controller action) and store
it into hidden form field. This hidden UUID is used as a key for cache.ram
value that expresses the viewScope variable. I use Storage() object as a
viewScope object as it is very easy to use. Now everything is working as
expected and during the all posts to same action (all posts of SQLFORM)
the hidden key is available and I can access the the same cach.ram
Storage() object, read and update values and everything is working fine.
What is not fine is fact that cache expire_time is timeout counted from the
first cache object creation time and expires in defined time. What I need
here is to have the expire time but prolonged each time I access the cache
so the expire time reflects users inactivity. Is there a way how to
accomplish this idea using the cache.ram? Also is there anyone who tried
to solve this already? I would appreciate your ideas / comments.
BTW: Despite the fact that HTTP is not statefull .. the statefull framework
features are very important during corporate development (during forking
with large form that requires many post submits until saved finaly). I
would really appreciate having some statefull ideas implemented in web2py
core. But its completely separate topic.
(Code below is just a proof of concept more than some final nice code. :-)
)
class ViewState:
@staticmethod
def getStateObject(state_id=None):
if state_id==None:
state_id=ViewState.getStateId()
from gluon.storage import Storage
return cache.ram('form_'+state_id, lambda:Storage(), time_expire=10)
@staticmethod
def getStateId(state_field='state_id'):
import uuid
return (request.post_vars.state_id or str(uuid.uuid4()))
def index():
state_id=ViewState.getStateId()
sc=ViewState.getStateObject(state_id)
form=SQLFORM.factory(
Field('jmeno','string',requires=IS_NOT_EMPTY()),
Field('prijmeni','string'),
hidden=dict(state_id=state_id)
)
....
--
---
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.