Does the problem occur only on the first page load of the session? If so, 
does the problem go away if you add the following line at the top of the 
many_ajx_form function:

    session.dummy_data = 'dummy data'

If that's the case, then this is the same problem diagnosed in the original 
thread, with something like the above as the solution. The problem is not 
that Ajax reads fail to lock the session -- the problem is that at the very 
beginning of the session when the initial set of Ajax requests are made, 
there is no session file to lock at all. Adding some dummy data to the 
session in the parent page will force a session file to be created, so the 
session file will then exist and therefore be locked when the Ajax requests 
come in. Note, this won't work with sessions stored in the DB or in 
cookies, as there is no session locking at all with those methods (you will 
need some other means to avoid session race conditions in those cases).

Anthony



On Sunday, August 9, 2015 at 2:34:48 AM UTC-4, Val K wrote:
>
> Hi!
> I have the same problem (twice submission). Here is my little test:
>
> #paste in default.py
> #!!! for pure test clean cookies before run!!!
>
> def print_form_keys():
>     ret=DIV(_class="container")
>     for i in xrange(5):
>         frm_k= '_formkey[%s]' % ('frm_id%s/create'%i) #- see html.FORM
>         ret.append( DIV( frm_k,
>                         OL(*(session[frm_k] or ['None']))
>                         )
>                   )
>     return dict(r=ret)
>
> def ajx_bug():
>     form_name='frm_id%s'%request.args(0)
>     form=SQLFORM.factory(Field('any'), table_name=form_name)
>     if form.process(session=session).accepted:
>         response.flash=form.vars.any
>     return dict(form=form)
>
> #------------ CALL THIS --------------------
> def many_ajx_form():
>     ret={}
>     for i in xrange(5):
>         ret['ajx_frm_%s'%i]= \
>         DIV(
>             LOAD('default','ajx_bug.load',
>                  args=[i],
>                  ajax=True,
>                  target='cont_%s'%i
>                  ),
>             _id='cont_%s'%i
>            )
>
>     #----------- ajax print session -----------------
>     data=dict(
>            rmt= '/%s/default/print_form_keys.load'%request.application,
>            trg='print_session'
>              )
>     scr=SCRIPT("""
>             var i=0
>             var ajx_forms_num=5
>             $( document ).ajaxComplete(function(e)
>             {
>                 print_session();
>                 $("form").submit( print_session);
>             });
>
>             function print_session(e)
>              {
>                 if ((++i)>=ajx_forms_num)
>                 {
>                     $.web2py.component("%(rmt)s", "%(trg)s", 0, 1, 
> $("#%(trg)s"));
>                 }
>              };
>             """%data)
>     ret['scr']=scr
>     ret['print']=DIV(_id='print_session')
>     return ret
>
> Result on local (win7x32, 2.12.1-stable+timestamp.2015.08.07.07.22.06   
> (Running 
> on Rocket 1.2.6, Python 2.7.9)):
>
> Many Ajx Form
> ajx_frm_0:
> Any:
>
>
> ajx_frm_1:
> Any:
>
>
> ajx_frm_2:
> Any:
>
>
> print:
> _formkey[frm_id0/create]
>    
>    1. *None*
>
> _formkey[frm_id1/create]
>    
>    1. *None*
>
> _formkey[frm_id2/create]
>    
>    1. *41f6606c-f149-4382-9216-a35d205a3bd*
>
>
> As seen, only one ajax form (frm_id2) has a formkey and it works properly! 
> but other require twice submissions.
>  It seems, that during ajax-request session locked for write only but not 
> for read!
> Keep in mind that browsers starts next  ajax-request before completion of 
> previous one.
> I put some log-code in  *FORM.accepts*  - it writes session's all 
> formkeys every FORM.accepts-call to separated files  (one call - one file) 
> and I got the same:
> In each file there is only  one (but different) formkey! i.e. each 
> ajax-request process has own version of session.
> If set session=None   ( *form**.process( session = None )*  )  all works 
> fine!
>
>
>
>

-- 
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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to