2016-05-17 50 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