2010-11-03 24 views
0

Я могу использовать очередь задач для изменения значения базы данных, но как я могу получить возвращаемое значение, например Ajax, используя очередь задач?Как получить возвращаемое значение (например, Ajax) с помощью очереди задач в Google App Engine

Это мой код:

from google.appengine.api.labs import taskqueue 
from google.appengine.ext import db 
from google.appengine.ext import webapp 
from google.appengine.ext.webapp import template 
from google.appengine.ext.webapp.util import run_wsgi_app 
import os 

class Counter(db.Model): 
    count = db.IntegerProperty(indexed=False) 

class BaseRequestHandler(webapp.RequestHandler): 
    def render_template(self, filename, template_values={}): 
     values={ 
     } 
     template_values.update(values) 
     path = os.path.join(os.path.dirname(__file__), 'templates', filename) 
     self.response.out.write(template.render(path, template_values)) 


class CounterHandler(BaseRequestHandler): 
    def get(self): 
     self.render_template('counters.html',{'counters': Counter.all()}) 

    def post(self): 
     key = self.request.get('key') 
     # Add the task to the default queue. 
     for loop in range(0,1): 
      a=taskqueue.add(url='/worker', params={'key': key}) 

     #self.redirect('/') 

     self.response.out.write(a) 

class CounterWorker(webapp.RequestHandler): 
    def post(self): # should run at most 1/s 
     key = self.request.get('key') 
     def txn(): 
      counter = Counter.get_by_key_name(key) 
      if counter is None: 
       counter = Counter(key_name=key, count=1) 
      else: 
       counter.count += 1 
      counter.put() 
     db.run_in_transaction(txn) 
     self.response.out.write('sss')#used for get by task queue 

def main(): 
    run_wsgi_app(webapp.WSGIApplication([ 
     ('/', CounterHandler), 
     ('/worker', CounterWorker), 
    ])) 

if __name__ == '__main__': 
    main() 

Как я могу показать 'SSS'?

ответ

2

Текущий Task Queue API не поддерживает обработку возвращаемых значений или отправку их обратно в исходную точку. Процесс appengine не достаточно долговечен, чтобы парадигма программирования работала.

В вашем примере, это выглядит как то, что вы хотите что-то вроде этого:

  1. Создать задачу
  2. Возвращение AJAX кода, который будет опрашивать обработчик проблемно-статус
  3. процессов задач, обновления хранилище с возвращаемое значение
  4. Task-статус URL возвращает обновленное значение

в качестве альтернативы, если вы не хотите, чтобы RET urn «sss» для клиента, но вместо этого он нужен для дальнейшей обработки, вам нужно разделить свой метод на несколько частей. Первая часть создает задачу, а затем выходит. В конце процесса задачи он добавляет новую задачу, чтобы перезвонить во вторую часть с возвращаемым значением.

Смежные вопросы