Gmail-API auf GAE: korrekt mit discovery.build_from_document ()

Ich laufe eine Reihe von Aufgaben auf der GMail API und bekomme den gleichen Fehler wie in dieser Ausgabe beschrieben . Um es zu lösen, möchte ich die vorgeschlagene Lösung implementieren. Allerdings bin ich mir nicht sicher, wie ich das auf meinen Code anwenden darf.

Mein Code sieht derzeit wie folgt aus:

class getLatest(webapp2.RequestHandler): def post(self): try: email = self.request.get('email') g = Credentials.get_by_id(email) REFRESH_TOKEN = g.refresh_token start_history_id = g.hid credentials = OAuth2Credentials(None, settings.CLIENT_ID, settings.CLIENT_SECRET, REFRESH_TOKEN, None, GOOGLE_TOKEN_URI, None, revoke_uri=GOOGLE_REVOKE_URI, id_token=None, token_response=None) http = credentials.authorize(httplib2.Http()) service = discovery.build("gmail", "v1", http=http) for n in range(0, 5): try: history = service.users().history().list(userId=email, startHistoryId=start_history_id).execute(http=http) break except errors.HttpError, e: if n < 4: time.sleep((2 ** n) + random.randint(0, 1000) / 1000) else: raise changes = history['history'] if 'history' in history else [] while 'nextPageToken' in history: page_token = history['nextPageToken'] for n in range(0, 5): try: history = service.users().history().list(userId=email, startHistoryId=start_history_id, pageToken=page_token).execute(http=http) break except errors.HttpError, e: if n < 4: time.sleep((2 ** n) + random.randint(0, 1000) / 1000) else: raise changes.extend(history['history']) except errors.HttpError, error: logging.exception('An error occurred: '+str(error)) if error.resp.status == 401: # Credentials have been revoked. # TODO: Redirect the user to the authorization URL. raise NotImplementedError() else: stacktrace = traceback.format_exc() logging.exception('%s', stacktrace) 

Jetzt soll ich zu irgendeinem Zeitpunkt in der Zeit den folgenden Code laufen lassen:

 resp, content = h.request('https://www.googleapis.com/discovery/v1/apis/analytics/v3/rest?quotaUser=the_name_of_your_app_goes_here') 

Und dann den Wert für den Inhalt im Datenspeicher speichern. Das Problem erklärt, das ist nicht benutzergebunden, aber es ist mir nicht klar, ob ich das einmal ausführen und den Wert bis zur Ewigkeit speichern oder in bestimmten Momenten rechtzeitig erfrischen soll.

Darüber hinaus, da ich die Autorisierung ein bisschen anders behandle, habe ich das Gefühl, dass ich dort auch Probleme machen werde, wenn ich es genau so implementiere. Ursache, wenn ich den Service baue, füge ich eigentlich die Anmeldeinformationen in den Anruf hinzu:

 http = credentials.authorize(httplib2.Http()) service = discovery.build("gmail", "v1", http=http) 

    One Solution collect form web for “Gmail-API auf GAE: korrekt mit discovery.build_from_document ()”

    Stellt sich heraus, dass es ganz einfach war. Ich habe folgende Funktion hinzugefügt:

     def get_discovery_content(): content = memcache.get('gmail_discovery') if content is not None: return content else: h = httplib2.Http() for n in range(0, 5): resp, content = h.request('https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest?quotaUser=replimeapp') if resp.status == 200: memcache.add('gmail_discovery', content, 86400) return content 

    Dann habe ich diese Zeile ersetzt:

     service = discovery.build("gmail", "v1", http=http) 

    Dadurch:

     content = get_discovery_content() service = discovery.build_from_document(content) 

    Funktioniert wie ein Charme so weit.

    Python ist die beste Programmiersprache der Welt.