2016-05-17 47 views
0

我試圖在後臺任務中創建多個Google文檔。使用任務隊列創建多個Google文檔

我嘗試使用從Google App Enginetaskqueue但我一直得到這條消息,我必須不明白的一點:

INFO  2016-05-17 15:38:46,393 module.py:787] default: "POST /update_docs HTTP/1.1" 302 - 
WARNING 2016-05-17 15:38:46,393 taskqueue_stub.py:1981] Task task1 failed to execute. This task will retry in 0.800 seconds 

這裏是我的代碼。我對需要從隊列中執行的方法UpdateDocs進行多次調用。

# Create a GDoc in the queue (called by her) 
class UpdateDocs(BaseHandler): 
    @decorator.oauth_required 
    def post(self): 
     try: 
      http = decorator.http() 
      service = discovery.build("drive", "v2", http=http) 

      # Create the file 
      docs_name = self.request.get('docs_name') 
      body = { 
       'mimeType': DOCS_MIMETYPE, 
       'title': docs_name, 
      } 
      service.files().insert(body=body).execute() 
     except AccessTokenRefreshError: 
      self.redirect("/") 


# Create multiple GDocs by calling the queue 
class QueueMultiDocsCreator(BaseHandler): 
    def get(self): 
     try: 
      for i in range(5): 
       name = "File_n" + str(i) 
       taskqueue.add(
        url='/update_docs', 
        params={ 
         'docs_name': name, 
        }) 
      self.redirect('/files') 
     except AccessTokenRefreshError: 
      self.redirect('/') 

我可以在App Engine控制檯中看到推送隊列,並且每個任務都在裏面,但他們無法運行,我不明白爲什麼。

+1

我懷疑你的授權流程失敗,你會得到'AccessTokenRefreshError'異常,在這種情況下你試圖重定向(這是狀態302,不能接受來自任務隊列的預期)。嘗試用'logging.error('AccessTokenRefreshError')''替換'post()'方法中的'self.redirect(「/」)',以確認 - 我期望任務完成並且錯誤在日誌中顯示。 –

+0

我試圖這樣做,但我沒有得到任何錯誤,仍然是相同的消息。 – Kariamoss

+0

似乎缺少所有oauth代碼。從任務隊列重定向沒有意義。您使用的代碼是爲前端實例get編寫的。 –

回答

-1

請嘗試在您的代碼中指定worker模塊。

Creating a new task所示,在調用taskqueue.add()函數之後,它將目標名爲worker的模塊並通過設置url/update-counter來調用其處理函數。

class EnqueueTaskHandler(webapp2.RequestHandler): 
    def post(self): 
     amount = int(self.request.get('amount')) 

     task = taskqueue.add(
      url='/update_counter', 
      target='worker', 
      params={'amount': amount}) 

     self.response.write(
      'Task {} enqueued, ETA {}.'.format(task.name, task.eta)) 

,從我在這blog已閱讀,一個worker是一個任務隊列的一個重要棋子。這是一個python進程,它從隊列中讀取作業,並一次執行一個作業。

我希望有幫助。

+0

這兩個方法在同一個文件中,所以我不需要指定一個目標。 'worker'就是他們的模塊名稱。 – Kariamoss