希望有人可以提供帮助。我正在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)
答案 0 :(得分:0)
首先,删除顶层的http=decorator.http
- 它似乎没有被使用,只能在装饰方法中使用。
我不确定,但看看装饰器代码,我认为它是基于user_id()的键控。您的代码正在显示该代码,但您传递给任务的参数不是。试试{'user_id' : users.get_current_user().user_id()}
。