如何在GAE cron作业中执行OAuth操作?

Ron*_*het 5 python cron google-app-engine google-api google-api-python-client

这篇文章是如何在GAE任务队列中执行OAuth要求操作的后续内容.正如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=...
    
    Run Code Online (Sandbox Code Playgroud)
  • ...但是,它总是失败(在AppEngine的Cron Jobs部分显示为红色"失败"),它应该运行的任务队列永远不会弹出任务队列部分.

我不明白的是,如果我/update手动打开,我有下面的登录提示.cron如何绕过那个?我该如何调试正在进行的操作?

GAE登录提示

谢谢您的帮助.

在@dlebech答案编辑/后随:问题添加后仍继续login: admin行有关urlapp.yaml.在本地(通过以管理员身份登录并访问您的浏览器中的处理程序的URL,安全URL 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')
    
    Run Code Online (Sandbox Code Playgroud)
  • ...这是我在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
    
    Run Code Online (Sandbox Code Playgroud)

dle*_*ech 4

cron 应该如何绕过它?

确保 cron url 配置login: admin而非。Cron 作业会自动“跳过登录提示”。请参阅文档以获取更多信息。 login: required

我怎样才能调试发生了什么?

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