2

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')

ここで何が問題なのか、両方のメソッドがほぼ同じことを行う場合に「ログインが必要です」という例外が発生する理由と、別のケースでは発生しない理由を理解できません。

どんな助けでも大歓迎です。

4

1 に答える 1

2

問題を解決する方法を見つけました。

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

解決策は、実際にはこの回答に基づいています。

于 2013-04-21T16:11:39.897 に答える