0

我可以使用任务队列来更改数据库值,但是如何使用任务队列获得像 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'?

4

1 回答 1

2

当前的任务队列 API不支持处理返回值或将它们发送回源点。您的 appengine 进程的寿命不足以使该编程范式正常工作。

在您的示例中,您想要的是这样的:

  1. 创建任务
  2. 返回将轮询任务状态处理程序的 AJAX 代码
  3. 任务进程,使用返回值更新数据存储
  4. 任务状态 url 返回更新的值

或者,如果您不想将“sss”返回给客户端,而是需要它进行进一步处理,则需要将方法拆分为多个部分。第一部分创建任务然后退出。在任务流程结束时,它自己添加一个新任务,以使用返回值回调到第二部分。

于 2010-11-03T08:46:55.843 回答