2013-04-12 26 views
1

我正在使用python和appengine创建使用Google Calendar API(V3)的应用程序。使用Calendar v3 api python插入事件时出现HttpError 401“需要登录”

我可以列出来自多个日历等的事件。但是,我试图将事件插入日历时遇到问题。如果我在我的处理程序中使用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"> 

的功能简化版本得到()和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') 

我想不出这里有什么问题,为什么我收到“需要登录”异常在一种情况下,而不是在其他时候这两种方法几乎做同样的事情。

任何帮助表示赞赏。

回答

2

找到了如何解决问题。

我需要改变后()方法是这个样子:

@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) 
    : 
    : 

该解决方案实际上是基于this answer

相关问题