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')
ここで何が問題なのか、両方のメソッドがほぼ同じことを行う場合に「ログインが必要です」という例外が発生する理由と、別のケースでは発生しない理由を理解できません。
どんな助けでも大歓迎です。