HttpError 401 «Login Required» при использовании Calendar v3 api python для вставки события

Я использую python и appengine для создания приложения, которое использует API календаря Google (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') 

Я не могу понять, что здесь не так, и почему я получаю исключение «Login Required» в одном случае, а не в другом, когда оба метода делают почти то же самое.

Любая помощь приветствуется.

Выяснили, как решить проблему.

Мне нужно было изменить метод post (), чтобы выглядеть примерно так:

 @decorator.oauth_aware 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' }, } http = decorator.http() request = service.events().insert(calendarId='MyCalendarId', body=event).execute(http=http) : : 

Решение основано на этом ответе .