我正在使用 python 和 appengine 创建一个使用 Google Calendar API (V3) 的应用程序。
我可以从多个日历等中列出事件。但是,在尝试将事件插入日历时遇到了问题。
如果我在我的处理程序中使用 get(),一切正常(即事件被正确插入。但是,如果我使用表单和 post() 插入事件(在同一个日历中)它会失败并显示以下消息
<HttpError 401 when requesting https://www.googleapis.com/calendar/v3/calendars/.../events?alt=json returned "Login Required">
Traceback (most recent call last):
File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1511, in __call__
rv = self.handle_exception(request, response, e)
File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1505, in __call__
rv = self.router.dispatch(request, response)
File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1253, in default_dispatcher
return route.handler_adapter(request, response)
File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 547, in dispatch
return self.handle_exception(e, self.app.debug)
File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 545, in dispatch
return method(*args, **kwargs)
File "/base/data/home/apps/.../oauth2client/appengine.py", line 469, in check_oauth
return method(request_handler, *args, **kwargs)
File "/base/data/home/apps/...", line 99, in post
request = service.events().insert(calendarId='MyCalendarId', body=event).execute()
File "/base/data/home/apps/.../apiclient/http.py", line 678, in execute
raise HttpError(resp, content, uri=self.uri)
HttpError: <HttpError 401 when requesting https://www.googleapis.com/calendar/v3/calendars/.../events?alt=json returned "Login Required">
函数 get() 和 post() 的简化版本如下:
class AddEvent(webapp2.RequestHandler):
@decorator.oauth_required
def post(self):
if decorator.has_credentials():
#event_name = self.request.get('event-name')
event = {
'summary': self.request.get('summary'),
'location': self.request.get('place'),
'status' : self.request.get('status'),
'start': {
'dateTime': '2013-05-11T10:00:00.000-07:00' ,
'timeZone': 'America/New_York'
},
'end': {
'dateTime': '2013-05-11T10:25:00.000-07:00',
'timeZone': 'America/New_York'
},
}
request = service.events().insert(calendarId='MyCalendarId', body=event).execute()
else:
self.response.out.write(json.dumps({'error': 'No credentials'}))
page = 'main'
template_values = {
'url': url,
'url_linktext': url_linktext,
'menu' : page
}
template = jinja_environment.get_template('templates/index.html')
self.response.out.write(template.render(template_values))
@decorator.oauth_required
def get(self):
if decorator.has_credentials():
event_name = self.request.get('event-name')
event = {
'summary': 'Appointment from get',
'location': 'Somewhere close to it',
'start': {
'dateTime': '2013-04-15T10:00:00.000-07:00' ,
'timeZone': 'America/New_York'
},
'end': {
'dateTime': '2013-04-15T10:25:00.000-07:00',
'timeZone': 'America/New_York'
},
}
http = decorator.http()
request = service.events().insert(calendarId='MyCalendarId', body=event)
inserted = request.execute(http)
else:
self.response.out.write(json.dumps({'error': 'No credentials'}))
page = 'main'
template_values = {
'url': url,
'url_linktext': url_linktext,
'menu' : page
}
template = jinja_environment.get_template('templates/index.html')
self.response.out.write(template.render(template_values))
OAuth2 的使用如下:
decorator = OAuth2Decorator(
client_id='client ID',
client_secret='client secret',
scope='https://www.googleapis.com/auth/calendar')
我无法弄清楚这里出了什么问题,以及为什么我在一种情况下得到“需要登录”异常,而在另一种情况下,两种方法几乎都做同样的事情。
任何帮助表示赞赏。