i second the remove the try/except for debugging. I use google app engine
and default timeout for a URL fetch on that system is 5 seconds
(graph.get_object
does a url fetch) i find that in real life facebook does not respond in
under 5 seconds much more frequently then i would like - so that is
possibly your problem.
cfh
On Monday, January 14, 2013 3:19:05 AM UTC-8, Luciano Laporta Podazza wrote:
>
> Hello,
>
> I've been experimenting a really annoying issue that came up from nowhere
> 'cause the app was working perfectly. This is the scenario:
>
> A mobile app user(iOS) enter his credentials on Facebook and gets the
> corresponding auth token and personal data(JSON).
> The mobile app sends for the first time that data(name,last name, token,
> etc) to the server in JSON and the server processes it and store it if no
> errors occurred.
> This is the code(yes, it's really ugly but I'm a n00b):
>
> Controller:
> @service.json
> def first_time():
> data = gluon.contrib.simplejson.loads(request.body.read())
> graph = GraphAPI(data['token'])
> #We check that email and token exists and are valid, otherwise we
> store it for the first time.
> mail_check = db(db.auth_user.email==data['email']).select()
> if mail_check:
> token = db((db.auth_user.facebook_token!=data['token'])&(db.
> auth_user.email==data['email'])).select()
> if token:
> try:
> profile = graph.get_object("me")
> if profile:
> id = db(db.auth_user.email==data['email']).update(
> facebook_token=data['token'])
> return "token_updated"
> except:
> return "invalid_token1"
> else:
> #We create a new user!
> try:
> profile = graph.get_object("me")
> if profile:
> new = db.auth_user.insert(
> first_name=data['first_name'],
> last_name=data['last_name'],
> birthday= datetime.strptime(data['birthday'],
> '%d/%m/%Y').strftime('%Y-%m-%d'),
> email=data['email'],
> facebook_id=data['id'],
> facebook_token=data['token'],
> wizard=data['wizard'])
> return "new_user"
> except:
> return "ivalid_token2"
> return "user_exists"
>
>
> db.py:
>
> from gluon.tools import Auth
> auth = Auth(db, hmac_key=Auth.get_or_create_key())
>
>
> auth.settings.extra_fields['auth_user']= [
> Field('birthday', 'date'),
> Field('facebook_id', 'string'),
> Field('facebook_token', 'string'),
> Field('wizard', 'boolean'),
> ]
>
>
> JSON:
> {
> "first_name": "Luciano",
> "last_name": "Laporta Podazza",
> "country" : "Argentina",
> "date" : "2013-01-14",
> "email" : "[email protected] <javascript:>",
> "province" : "Tucumán",
> "timestamp" : "2013-01-14 06:13:45",
> "token" : "(token)"
> }
>
>
>
> This was actually working and I didn't modified anything(really). Now, the
> issue that I have is that with valid information the data isn't stored in
> the DB and get the "invalid_token2" error.
>
> Notes:
>
> - Facebook data is valid(specially tokens), I've tested all of them
> externally with GraphAPI and they work.
> - If I comment the whole .insert I get the "new_user" string, which is
> what I'm looking for. So this makes me think that something with the
> insert
> is wrong
> - All tables and fields are correct, they have been tested and working
> before this issue.
> - I've tried changing database adapters(I was using mysql and now
> sqlite and still get the same error).
> - All facebook accounts are valid and verified.
> - For some reason, some times it stores the data, and some times not,
> it's kind of random.
>
> Any suggestions?. Thanks in advance!
>
--