3
def get_code(request):
    try:
        user_info_service = get_service(request.user, 'oauth2', 'v2')
        user_info = user_info_service.userinfo().get().execute()
        if user_info and user_info.get('id'):
            request.session['cur_user'] = user_info
            return redirect('/me')
        else:
            raise NoUserIdException()
    except AccessTokenRefreshError as atrfsh:
        print atrfsh
        print traceback.print_tb(sys.exc_info()[2])
    except:
        print "This was the exception..."
        print sys.exc_info()
        auth_uri = FLOW.step1_get_authorize_url()
        print auth_uri
        return redirect(auth_uri)

def get_service(user, name, version):
    storage = Storage(CredentialsModel, 'id', user, 'credential')
    credential = storage.get()
    http = httplib2.Http()
    http = credential.authorize(http)
    service = build(name, version, http=http)
    return service

私は..ラインAccessTokenRefreshErrorに乗り続けます。user_info = user_info_service.userinfo()

AccessTokenRefreshErrorのexceptブロックでは、「invalid_grant」を出力しています。

OAuth2Credentialsオブジェクトのドキュメントを読んだところ:http: //google-api-python-client.googlecode.com/hg/docs/epy/oauth2client.client.OAuth2Credentials-class.html#authorize、でcredential.authorizeメソッドがget_serviceどうやら自動的にアクセストークンの更新を実行する必要があります。

アクセストークンを更新できないのは何が間違っているのですか?

4

1 に答える 1

3

これは回避策です。

また、 への 10 回の呼び出しごとにほぼ同じエラーが発生しているtasklists.list()ため、この問題は に固有のものではありませんuserinfo

私が見つけた唯一の解決策は、API 呼び出しを再試行ループに入れることです。すぐに再試行すると失敗するため、再試行する前にスリープを含めます。45 秒のスリープで、約 99.5% の確率で動作します。

誰かがより良い解決策を投稿できることを願っています。

于 2013-01-02T13:29:05.567 に答える