我希望在两个特定日期之间获取Google日历的所有免费活动。我正在关注documentation of the freebusy object。
基本上,我有一个index.html,其表单允许选择两个日期。我将这些日期发送到我的应用程序(Python Google AppEngine支持)。
这是简化的代码,使其更具可读性:
CLIENT_SECRETS = os.path.join(os.path.dirname(__file__), 'client_secrets.json')
decorator = oauth2decorator_from_clientsecrets(
CLIENT_SECRETS,
scope='https://www.googleapis.com/auth/calendar',
message=MISSING_CLIENT_SECRETS_MESSAGE)
service = build('calendar', 'v3')
class MainPage(webapp2.RequestHandler):
@decorator.oauth_required
def get(self):
# index.html contains a form that calls my_form
template = jinja_enviroment.get_template("index.html")
self.response.out.write(template.render())
class MyRequestHandler(webapp2.RequestHandler):
@decorator.oauth_aware
def post(self):
if decorator.has_credentials():
# time_min and time_max are fetched from form, and processed to make them
# rfc3339 compliant
time_min = some_process(self.request.get(time_min))
time_max = some_process(self.request.get(time_max))
# Construct freebusy query request's body
freebusy_query = {
"timeMin" : time_min,
"timeMax" : time_max,
"items" :[
{
"id" : my_calendar_id
}
]
}
http = decorator.http()
request = service.freebusy().query(freebusy_query)
result = request.execute(http=http)
else:
# raise error: no user credentials
app = webapp2.WSGIApplication([
('/', MainPage),
('/my_form', MyRequestHandler),
(decorator.callback_path, decorator.callback_handler())
], debug=True)
但是我在freebusy调用中遇到了这个错误(堆栈跟踪的有趣部分):
File "/Users/jorge/myapp/oauth2client/appengine.py", line 526, in setup_oauth
return method(request_handler, *args, **kwargs)
File "/Users/jorge/myapp/myapp.py", line 204, in post
request = service.freebusy().query(freebusy_query)
TypeError: method() takes exactly 1 argument (2 given)
我做了一些研究,但是我没有在Python上找到任何运行日历v3和freebusy调用的示例。我成功地在API explorer中执行了调用。
如果我理解错误,似乎oauth_aware装饰器过滤以任何方式控制其控制下的代码的所有调用。可调用函数传递给oauth2client的方法OAuthDecorator.oauth_aware
。这个callable是webapp2.RequestHandler的一个实例。与MyRequestHandler
一样。
如果用户被正确记录,则oauth_aware方法通过调用method(request_handler, *args, **kwargs)
返回对所需方法的调用。这就是错误。一个TypeError
,因为method
占用的参数多于允许的参数。
这是我的解释,但我不知道我是不对的。我应该以任何其他方式致电freebusy().query()
吗?我的分析中的任何一部分真的有意义吗?我迷失了......
非常感谢提前
答案 0 :(得分:4)
正如bossylobster建议的那样,解决方案非常简单。只需更换此电话
即可service.freebusy().query(freebusy_query)
有了这个
service.freebusy().query(body=freebusy_query)
谢谢!