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

現在のTask Queue APIは、戻り値の処理や元の場所への返送をサポートしていません。あなたの appengine プロセスは、そのプログラミング パラダイムが機能するのに十分な長さではありません。

あなたの例では、あなたが望むのは次のようなものです:

  1. タスクを作成
  2. タスク ステータス ハンドラをポーリングする AJAX コードを返す
  3. タスクが処理し、戻り値でデータストアを更新します
  4. タスクステータス URL が更新された値を返す

または、'sss' をクライアントに返したくないが、代わりにさらなる処理のために必要な場合は、メソッドを複数の部分に分割する必要があります。最初の部分は、タスクを作成してから終了します。タスクのプロセスの最後に、新しいタスク自体を追加して、戻り値で 2 番目の部分にコールバックします。

于 2010-11-03T08:46:55.843 に答える