0

我有一个 OAuth2 装饰器:

decorator = OAuth2DecoratorFromClientSecrets(CLIENT_SECRETS, YOUTUBE_READ_WRITE_SCOPE)

...我有时会调用一个需要身份验证的函数:

  playlist_id = youtube_create_playlist(youtube)

...所以我在它前面加上decorator

@decorator.oauth_required
def youtube_create_playlist(youtube):
  playlists_insert_response = youtube.playlists().insert(
  ...

→ 正如预期的那样,当youtube_create_playlist()我进入 时,我经过oauth2client/appengine.py:oauth_required(),然后check_oauth(),然后_create_flow(),在appengine.py1.7.7 的第 674 行,我们有:

redirect_uri = request_handler.request.relative_url(
          self._callback_path) # Usually /oauth2callback

→ 但是在这一步,GAE 出错并抛出异常AttributeError: 'Resource' object has no attribute 'request'。事实上,我可以在我的变量调试窗格中看到该request_handler对象没有属性“请求”。难道我做错了什么?它是一个错误吗?我还创建了google-api-python-client issue264

4

1 回答 1

2

好的,我认为您对这个装饰器的工作方式有一些了解,

它旨在用作文档中使用日历 api https://developers.google.com/api-client-library/python/platforms/google_app_engine#的示例中的 Web 处理程序(GET/POST 处理程序)的装饰器#装饰器

节目

@decorator.oauth_required
  def get(self):
    # Get the authorized Http object created by the decorator.
    http = decorator.http()
    # Call the service using the authorized Http object.
    request = service.events().list(calendarId='primary')
    response = request.execute(http=http)
    ...

您尚未共享所有代码,但您youtube_create_playlist看起来不像标准的 Web 处理程序(好吧,也许您没有使用 webapp(2))并且没有使用基于类的处理程序

请求对象需要以某种方式传入。在 webapp 处理程序中,请求在被请求时被传递给处理程序的实例,如果您以这种方式设置它,您的方法将可以访问 self.request(装饰器也可以)。

如果以上没有意义,我建议您包含更多代码。

于 2013-04-30T23:24:17.333 回答