2010-11-03 4 views
0

Je peux utiliser une file d'attente de tâches pour modifier la valeur de la base de données, mais comment puis-je obtenir la valeur de retour?Comment obtenir la valeur de retour (comme Ajax) en utilisant la file d'attente des tâches sur Google App Engine

Ceci est mon code:

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() 

Comment puis-je montrer le 'sss'?

Répondre

2

Le Task Queue API actuel ne prend pas en charge le traitement des valeurs renvoyées ou leur renvoi au point d'origine. Votre processus d'appengine n'est pas assez long pour que ce paradigme de programmation fonctionne.

Dans votre exemple, il ressemble à ce que vous voulez est quelque chose comme ceci:

  1. Créer tâche
  2. Retour code AJAX qui interrogera un gestionnaire tâche d'état
  3. processus de travail, mises à jour datastore avec une valeur de retour
  4. retourne url Tâche d'état-valeur mise à jour

Sinon, si vous ne voulez pas ret urn 'sss' au client, mais vous en avez besoin pour un traitement ultérieur, vous devrez diviser votre méthode en plusieurs parties. La première partie crée la tâche et se termine ensuite. A la fin du processus de la tâche, il ajoute une nouvelle tâche à rappeler dans la seconde partie avec la valeur de retour.

Questions connexes