GAE上的Gmail API:正确使用Discovery.build_from_document() [英] Gmail API on GAE: Correctly using discovery.build_from_document()

查看:55
本文介绍了GAE上的Gmail API:正确使用Discovery.build_from_document()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在GMail API上运行许多任务,并遇到与

I'm running a number of tasks on the GMail API and am getting the same error as described in this issue. To resolve it, I would like to implement the suggested solution. However I am not sure how to apply this to my code.

我的代码当前如下所示:

My code currently looks as follows:

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)

现在我应该在某个时候运行以下代码:

Now I am supposed to run following code at some moment in time:

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

然后将内容的值保存在数据存储中.该问题说明这不是用户绑定的,但是我不清楚我是否应该运行一次并将其存储到永恒,或者在某些时候刷新它.

And then save the value for content in the datastore. The issue explains this is not user-bound, however it is not clear to me if I should run this once and store the value until eternity, or refresh it at certain moments in time.

此外,由于我处理授权的方法有所不同,因此我有一种感觉,如果我以完全相同的方式实施授权,也会遇到麻烦.原因是在构建服务时,实际上是在调用中添加了凭据:

In addition, since I am handling authorization a bit different, I have the feeling I will run into issues there as well if I implement it the exact same way. Cause when I build the service, I actually add the credentials in the call:

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

推荐答案

结果很简单.我添加了以下功能:

Turns out it was quite straight forward. I added following function:

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  

然后我替换了这一行:

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

通过这个:

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

到目前为止,它的工作原理就像是一种魅力.

Works like a charm so far.

这篇关于GAE上的Gmail API:正确使用Discovery.build_from_document()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆