将凭据传递给任务

时间:2013-11-19 22:51:57

标签: google-app-engine google-oauth

希望有人可以提供帮助。我正在Google应用引擎上构建应用,并尝试将经过身份验证的用户的凭据传递给推送任务处理程序。我正在使用OAuth2DecoratorFromClientSecrets库来创建装饰器,它似乎将用户的凭据存储在数据存储区中。它使用类似“110111913122157971566”的键名存储它。我的问题是,我似乎无法找到一种方法来弄清楚该键名是什么,以便我可以使用我的工作者处理程序中的StorageByKeyName方法检索它。我读过的文档使用user_id作为键名,但这对我不起作用,因为凭证不是以user_id作为键名存储的,但是如果我对键名进行硬编码,那么代码就可以了。我知道我可以在Submit处理程序中运行复制代码,但需要将其作为单独的任务运行。以下是我的代码示例,感谢您提供的任何帮助:

JINJA_ENVIRONMENT = jinja2.Environment(
loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
extensions=['jinja2.ext.autoescape'],
autoescape=True)

SCOPES =['https://www.googleapis.com/auth/drive']
decorator = OAuth2DecoratorFromClientSecrets(    
                                             os.path.join(os.path.dirname(__file__),
                                             'client_secrets.json'),
                                             ' '.join(SCOPES)
                                            )
class MainPage(webapp2.RequestHandler):
  def get(self):        
    if users.get_current_user():
        url = users.create_logout_url(self.request.uri)
        url_linktext = 'Logout'            
        template_values = {'url': url,
                           'url_linktext': url_linktext,
                          }

        template = JINJA_ENVIRONMENT.get_template('index.html')
        self.response.write(template.render(template_values))   

    else:
        self.redirect(users.create_login_url(self.request.uri))

 class Submit(webapp2.RequestHandler):
    @decorator.oauth_required
    def post(self):
      taskqueue.add(url='/worker', params={'user_id' : users.get_current_user().user_id()})
      self.response.write('<html><body>You wrote:<pre>')
      self.response.write(users.get_current_user().user_id())
      self.response.write('</pre></body></html>')

  class Worker(webapp2.RequestHandler):
    def post(self):
      user_id = self.request.get('user_id')
      credentials = StorageByKeyName(CredentialsModel, user_id , 'credentials').get()
      http = httplib2.Http()
      http = credentials.authorize(http)
      service = build('drive', 'v2',http=http)
      fileId = 'actual file_id of drive file here'
      copied_file = {'title': 'My New Test Doc2'}
      new_file = service.files().copy(fileId=fileId,body=copied_file).execute(http=http)

application = webapp2.WSGIApplication([
('/', MainPage),
('/submit', Submit),
('/worker', Worker),
(decorator.callback_path, decorator.callback_handler()),
], debug=True)

1 个答案:

答案 0 :(得分:0)

首先,删除顶层的http=decorator.http - 它似乎没有被使用,只能在装饰方法中使用。

我不确定,但看看装饰器代码,我认为它是基于user_id()的键控。您的代码正在显示该代码,但您传递给任务的参数不是。试试{'user_id' : users.get_current_user().user_id()}