我有装饰员:

http = httplib2.Http()
service = discovery.build('gmail', 'v1', http=http)
# Creating decorator for OAuth2 account.
decorator = appengine.oauth2decorator_from_clientsecrets(
    CLIENT_SECRETS,
    scope='https://www.googleapis.com/auth/gmail.readonly',
    message=MISSING_CLIENT_SECRETS_MESSAGE)
.

和使用它的类:

class CSVGeneratorHandler(webapp2.RedirectHandler):
    @decorator.oauth_required
    def get(self):
        http = decorator.http()
        first_messages = service.users().messages().list(userId='me').execute(http=http)
        template = JINJA_ENVIRONMENT.get_template('templates/success.html')
        self.response.write(template.render({}))
.

工作很棒。

但是当我尝试移动api请求 service.users()。消息()。列表(userid='me')。执行(http= http)到任务(使用延迟。推迟(get_mails))我收到错误:“需要登录”。

我了解get_mails函数必须接收主程序中的上下文或/和凭据。但我不明白如何做到这一点。

有人可以帮助我吗?

有帮助吗?

解决方案

我发现答案几个小时后。

首先,您需要将凭据保存到某个地方。因为我们GAE我们有特别的字段类型:

from oauth2client.appengine import StorageByKeyName  
from google.appengine.ext import db

class CredentialsModel(db.Model):
  credentials = CredentialsProperty()
.

下一步是在没有装饰器的情况下设置auth,只有在将任务发送到队列之后:

    user = users.get_current_user()
    flow = flow_from_clientsecrets(os.path.join(os.path.dirname(os.path.realpath(__file__)), CLIENT_SECRETS),
                           scope='https://www.googleapis.com/auth/gmail.readonly',
                           redirect_uri='http://127.0.0.1:8080/success')
    auth_uri = str(flow.step1_get_authorize_url())
    code = self.request.get('code')
    if not code:
        return self.redirect(auth_uri)
    credentials = flow.step2_exchange(code)

    storage = StorageByKeyName(CredentialsModel, user.user_id(), 'credentials')
    storage.put(credentials)

    deferred.defer(get_mails, user.user_id())
.

不要忘记在延迟功能中获取凭证!

def get_mails(user_id):
    storage = StorageByKeyName(CredentialsModel, user_id, 'credentials')
    credentials = storage.get()

    http = httplib2.Http()
    http = credentials.authorize(http)

    all_messages = []
    service = discovery.build('gmail', 'v1', http=http)
    first_messages = service.users().messages().list(userId='me').execute()
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top