5

Ten wpis jest kontynuacją do How to do OAuth-requiring operations in a GAE Task Queue?. Jak sugeruje bossylobster w tym poście, ja staram się hardcode user_id w moim skryptu, ale zadanie cron zawsze kończy się niepowodzeniem:Jak wykonać operacje wymagające OAuth w pracy cron GAE?

  • widzę to jest wyzwalane w dziennikach ...

    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=... 
    
  • ... jednak to nie zawsze (pokazuje się jako czerwone „Failed” w Cron Jobs sekcji AppEngine za), a kolejka zadanie to powinno nigdy uruchomić wyskakuje w sekcji zadanie kolejek.

Nie rozumiem, że jeśli ręcznie otworzę /update, otrzymam poniższy formularz logowania. W jaki sposób Cron ma to ominąć? Jak mogę debugować, co się dzieje?

GAE login prompt

Dzięki za pomoc.

EDIT/nawiązanie na @dlebech odpowiedź: problem nie ustąpi po dodaniu login: admin linię do danego url w app.yaml. Lokalnie (przez podpisując się jako administrator i odwiedzenie URL obsługi w przeglądarce jak wspomniano przez Securing URLs for Cron) wszystko idzie dobrze, ale gdy wdrożyć, moja aplikacja nie umknie dekoratora OAuth2:

  • z kilkoma debug print sprawozdania ...

    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') 
    
  • ... oto co widzę po wdrożeniu w moich dziennikach GAE (dzienniki zatrzymuje się na ostatniej linii, nic się nie dzieje obok):

    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 
    

Odpowiedz

4

Jak cron powinien ominąć to?

Upewnij się, że adres URL jest skonfigurowany z cron login: admin i nielogin: required. Zadania Cron "automatycznie przechodzą przez okno logowania". Aby uzyskać więcej informacji, patrz the documentation.

Jak mogę debugować, co się dzieje?

Ponieważ zadanie cron jest uruchamiany przez GET wniosek do określonego adresu URL, powinieneś być w stanie debugować pracę po prostu składając wniosek GET do tego adresu URL i albo zobaczyć jakie błędy serwer rozwój sprawia, lub zobaczyć, co znajduje się w dziennikach dla żądania GET.

+0

Cześć, dziękuję za skierowanie mnie w stronę 'login: admin', nie zrozumiałem, że miało to taki efekt. Niestety, problem utrzymuje się (a może to kolejny? Nie jestem pewien: - /).Dodałem dział ** EDYCJA/uzupełnienie w sekcji @dotbech odpowiedzi ** do mojego oryginalnego posta, co o tym sądzisz? –

+0

Dlaczego nadal potrzebujesz dekoratora oauth_required? – dragonx

+0

@dragonx Moja aplikacja tworzy listy odtwarzania YouTube, musi przejść przez [taniec OAuth2] (https://developers.google.com/youtube/v3/guides/authentication#OAuth2_Flows), a ten dekorator wydaje się być zalecanym/najprostszym sposobem iść. Czy się mylę? –