Как получить возвращаемое значение (например, Ajax), используя очередь задач в Google App Engine - PullRequest
0 голосов
/ 03 ноября 2010

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

Это мой код:

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'?

1 Ответ

2 голосов
/ 03 ноября 2010

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

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

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

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

...