Here's a hack that might work:

def progress():
    # when a form is submitted, change progress each second
    if request.post_vars:
        for i in range(5):
            session.progress = i
            # Write to the session file and unlock/close it.
            session._try_store_in_file(request, response)
            print "main:", session.progress
            sleep(1)
            # Re-open and re-lock the session file.
            session.connect()
        return "done"
    else:
        session.progress = -1
    return locals()

Note, this is not part of the public API and writing/closing/reconnecting 
to the session multiple times per request is not an officially supported 
feature.

Anthony

On Tuesday, February 16, 2016 at 6:24:20 PM UTC-5, Anthony wrote:
>
> During a single request, the "session" object is just a copy of the 
> session data stored in the session file. Any updates to the session during 
> a request are not written back out to the session file until after the 
> request has completed. So, in the progress() function, you are not updating 
> the session file itself every second, you are only updating that request's 
> local copy of the session data. Repeated calls to getprogress() will 
> therefore only see the original value from the session.
>
> Anthony
>
> On Tuesday, February 16, 2016 at 4:15:06 PM UTC-5, Alfonso Serra wrote:
>>
>> Im trying to make a progress bar by reading and writing a session 
>> variable:
>>
>> There are 2 controllers:
>>
>> Get session.progress
>> def getprogress():
>>     print "getprogress:", session.progress
>>     return session.progress
>>
>> This one takes 5 seconds to perform and changes session.progress each one.
>> def progress():
>>     # when a form is submitted, change progress each second
>>     if request.post_vars:
>>         for i in range(5):
>>             session.progress = i
>>             print "main:", session.progress
>>             sleep(1)
>>         return "done"
>>     else:
>>         session.progress = -1
>>     return locals()
>>
>> At the view, there are two ajax calls. One that triggers "getprogress" 
>> each second, and another one that triggers "progress" when a random form is 
>> submitted through ajax to avoid redirection.
>>
>> at the browser's console, getprogress only returns -1
>>
>> at the python console i get a log like this:
>> getprogress: -1
>> getprogress: -1
>> main: 0
>> getprogress: -1
>> main: 1
>> getprogress: -1
>> main: 2
>> getprogress: -1
>> main: 3
>> getprogress: -1
>> main: 4
>> getprogress: -1
>>
>> getprogress should be changing since im writing the session variable.
>>
>> If im changing a session variable in a controller why hasnt changed when 
>> i ask for it on another one?
>>
>> Should i be using cron jobs or threads to make a progress bar? Whats the 
>> best way?
>>
>> Thank you very much.
>>
>>

-- 
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