【问题标题】:How to do OAuth-requiring operations in a GAE cron job?如何在 GAE cron 作业中执行需要 OAuth 的操作?
【发布时间】:2013-05-27 15:37:59
【问题描述】:

这篇文章是 How to do OAuth-requiring operations in a GAE Task Queue? 的后续文章。正如 bossylobster 在这篇文章中所建议的那样,我确实尝试在我的脚本中硬编码 user_id,但 cron 任务总是失败:

  • 我可以在日志中看到它被触发...

    2013-05-31 14:20:00.879 /update 302 5ms 0kb AppEngine-Google; (+http://code.google.com/appengine)
    0.1.0.1 - - [31/May/2013:11:20:00 -0700] "GET /update HTTP/1.1" 302 385 - "AppEngine-Google; (+http://code.google.com/appengine)" "myapp.appspot.com" ms=6 cpu_ms=0 cpm_usd=0.000043 queue_name=__cron task_name=... app_engine_release=1.8.0 instance=...
    
  • ... 但是,它总是失败(在 AppEngine 的 Cron Jobs 部分显示为红色的“失败”),并且它应该运行的任务队列永远不会弹出在任务队列部分。

我不明白的是,如果我手动打开/update,我会在下面看到登录提示。 cron 应该如何绕过它?如何调试发生了什么?

感谢您的帮助。

编辑/跟进@dlebech 答案:在app.yaml 中将login: admin 行添加到相关url 后问题仍然存在。在本地(通过以管理员身份登录并在浏览器中访问处理程序的 URL,如 Securing URLs for Cron 所述)一切正常,但是一旦我部署,我的应用程序永远不会通过 OAuth2 装饰器:

  • 通过一些调试print 语句...

    import webapp2
    ...
    
    YOUTUBE_RW_SCOPE = "https://www.googleapis.com/auth/youtube"
    YOUTUBE_API_SERVICE_NAME = "youtube"
    YOUTUBE_API_VERSION = "v3"
    print "Building youtube object"
    print "Built youtube object"
    youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION)
    print "Building decorator object"
    decorator = OAuth2DecoratorFromClientSecrets(CLIENT_SECRETS, YOUTUBE_RW_SCOPE)
    print "Built decorator object"
    ...
    
    class FetchHandlerPage(webapp2.RequestHandler):
        print "Entering FetchHandlerPage"
    
        @decorator.oauth_required
        def get(self):
            print "Entering FetchHandlerPage:get"
            gae_user_id = USER_ID
            query_string = urlencode({'user_id': gae_user_id})
            taskqueue.add(url='/fetchworker?' + query_string, method='GET')
    
  • ...这是我在 GAE 日志中部署后看到的内容(日志在最后一行停止,接下来什么也没有发生):

    2013-05-31 16:12:02.765 /fetch 302 1746ms 0kb AppEngine-Google; (+http://code.google.com/appengine)
    0.1.0.1 - - [31/May/2013:13:12:02 -0700] "GET /fetch HTTP/1.1" 302 385 - "AppEngine-Google; (+http://code.google.com/appengine)" "myapp.appspot.com" ms=1747 cpu_ms=844 cpm_usd=0.000070 queue_name=__cron task_name=... loading_request=1 app_engine_release=1.8.0 instance=...
    I 2013-05-31 16:12:02.444 URL being requested: https://www.googleapis.com/discovery/v1/apis/youtube/v3/rest?userIp=0.1.0.1
    E 2013-05-31 16:12:02.764 Building youtube object
    E 2013-05-31 16:12:02.764 Built youtube object
    E 2013-05-31 16:12:02.764 Building decorator object
    E 2013-05-31 16:12:02.764 Built decorator object
    E 2013-05-31 16:12:02.764 End static variables
    E 2013-05-31 16:12:02.764 Entering FetchHandlerPage
    I 2013-05-31 16:12:02.765 This request caused a new process to be started for your application, and thus caused your application code to be loaded for the first time. This requ
    

【问题讨论】:

    标签: python google-app-engine cron google-api google-api-python-client


    【解决方案1】:

    cron 应该如何绕过它?

    确保 cron url 配置为 login: adminnot login: required。 Cron 作业自动“通过登录提示”。请参阅the documentation 了解更多信息。

    如何调试发生了什么?

    由于 cron 作业是由对特定 url 的 GET 请求启动的,您应该能够通过向该 url 发出 GET 请求来调试该作业,并查看开发服务器产生的错误或查看GET 请求的日志中有什么内容。

    【讨论】:

    • 嗨,谢谢你把我指向login:admin,我不明白它有这个效果。可悲的是,问题仍然存在(或者可能是另一个问题?我不确定:-/)。我在原始帖子中添加了 @dlebech answer 上的编辑/跟进 部分,您怎么看?
    • 为什么还需要 oauth_required 装饰器?
    • @RonanJouchet。是的,这是错误的。如果没有用户,那么装饰器不是你想要的。您不需要它,因为您拥有来自 /update?user_id=SOME_VALUE 的用户 ID。
    • 您可能需要 oauth2 才能登录 YouTube。但是您不再使用 oauth2 进入带有 cron 作业或任务队列的 FetchHandlerPage,这些请求已通过 Google 的用户 API 进行身份验证。
    • @RonanJouchet 正如 dragonx 所暗示的那样,它可能对您有用的原因是您在访问该 url 时已经登录了您的 Google 帐户。看看 oauth_required 装饰器做了什么会很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多