On Sep 16, 2011, at 10:02 AM, Eric wrote: > request.args(0) does not seem to work. When I try Massimo's > suggestion for a token check, I get the traceback below on the error > ticket. I've tested the database query, and it works fine. Also, the > service call works fine when I remove the token check. This is what I > get when I use curl to call > https://mysite.com/myapp/api/call/run/myservice?token=cxvkYdjuH8azQnBPR175&serviceargument=1234 > > Traceback (most recent call last): > File "/home/www-data/web2py/gluon/restricted.py", line 192, in > restricted > exec ccode in environment > File "/home/www-data/web2py/applications/app/controllers/api.py", > line 60, in <module> > File "/home/www-data/web2py/gluon/globals.py", line 145, in <lambda> > self._caller = lambda f: f() > File "/home/www-data/web2py/applications/app/controllers/api.py", > line 53, in call > if row.token == token: > AttributeError: 'NoneType' object has no attribute 'token' > > It would appear that the request.vars(0) is getting a None result when > I try to grab it. What am I doing wrong?
request.args(0) (not vars) assumes a url like .../run/myservice/cxfkY..., though it seems to me that'd be args(2). But as you've written the URL, you'd get the token as request.vars.token, I think. > > Thank you, > > Eric > > On Sep 15, 11:15 pm, Massimo Di Pierro <massimo.dipie...@gmail.com> > wrote: >> Looking at your code again: >> >> @auth.requires_login() >> def call(token): >> row = db(db.subscription.token == token).select().first() >> my_number = row.my_calls >> if my_number > 0 & my_token == token: >> db(db.subscription.token == >> my_token).update(my_calls=db.subscription.my_calls-1) >> return service() >> else: >> raise Exception() >> >> I see two problems: >> 1) >> you have both @auth.requires_login() which only works if you enable >> auth.allow_basic_login = True >> and you have token authentication. Are you sure you want two >> authentications one on top of the other? >> 2) >> call is a method and cannot take arguments. >> >> If your intention is passing the token as request.args(0) simply do: >> >> def call(): >> token = request.args(0) # grab the token >> row = db(db.subscription.token == token).select().first() >> my_number = row.my_calls >> if my_number > 0 & my_token == token: >> db(db.subscription.token == >> my_token).update(my_calls=db.subscription.my_calls-1) >> del request.args[0] # make sure you remove the token else you >> may mess-up some services. >> return service() >> else: >> raise Exception() >>