Hello all,

a question about web2py and concurrent requests on GAE - I'm seeing some 
odd behavior and i would like to know if my theory is at all reasonable, 
and suggestions for testing my theory.  an RTFM (read the friggen manual) 
response is just fine - can you point me to the manual?

my assertion:  on GAE web2py puts per-request items into the shared global 
namespace, such as db and auth.  this causes problems on GAE with 
concurrency enabled because data gets clobbered.

why do i believe this?  well, i turned on concurrency (threadsafe: true) in 
app.yaml and after some time as the site gets loaded with real users (i 
have not run into this when testing probably because i don't generate 
enough test traffic) i see errors like:

  File 
"/base/data/home/apps/s~myapp/default-30a0bc01f698.356965928401701861/applications/myapp/controllers/admin_stores.py",
 line 10, in <module>
    auth.settings.actions_disabled=['profile', 'change_password']
NameError: name 'auth' is not defined

AttributeError: 'auth_user' object has no attribute 'preferred_store'

  File 
"/base/data/home/apps/s~myapp/default-30a0bc01f698.356965928401701861/applications/myapp/controllers/order.py",
 line 12, in <module>
    db.store.virtualfields.append(StoreVirtualFields())
NameError: name 'db' is not defined


  File 
"/base/data/home/apps/s~myapp/default-30a0bc01f698.356965928401701861/applications/myapp/controllers/food.py",
 line 22, in menu
    response.title = response.title + " - Our Menu"
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'

i'd love to prove or disprove my theory that what is happening is that 
while the request that errors is being processed, db.py (and menu.py) is 
being evaluated for a second request, essentially clearing variables like 
db, auth, and perhaps even response  (the None response.title when 
response.title is set in menu.py is most concerning).

i admit to not fully understanding how the run_X_in_environment(), and 
build_environment() and python variable scoping works well enough to know 
if my theory is valid and how best to test my theory?  i've thought about 
putting a sleep in db.py just to see if i can reliably re-create this type 
of behaviour.

any thoughts?

thanks,

christian

Reply via email to