2012-03-06 6 views
1

Je procédez comme suit:Comment utiliser la fonctionnalité GAE différée?

from google.appengine.ext import deferred 

def send_message(client_id, message): 
    logging.info("sending message...") 

class MyHandler(webapp.RequestHandler): 
    def get(self, field_name): 
     ... 
     scUpdate = { 
         'val': value, 
         'name': field_name_converted 
        } 
     message = simplejson.dumps(scUpdate)      
     deferred.defer(send_message, client_id, message, _countdown=random.randrange(0, 5, 1)) 

et d'obtenir

PermanentTaskFailure: 'module' object has no attribute 'send_message' 

Quel est le problème ici?

Mise à jour. On dirait que le problème est le même que celui décrit ici - PermanentTaskFailure: 'module' object has no attribute 'Migrate' - mais je ne comprends pas comment résoudre ce problème.

+2

Je pensais que le commentaire de Nick à cette réponse liée était assez clair - vous ne pouvez pas utiliser une fonction qui est définie dans un module que vous utilisez directement comme un gestionnaire de app.yaml. Déplacez-le dans un fichier différent et importez-le. –

+0

@DanielRoseman, est-ce la seule approche possible? Donc, j'aurai la même fonctionnalité dans 2 fichiers différents? Serait-il préférable d'utiliser directement Task Queue à la place? –

+0

Pourquoi serait-ce dans deux fichiers? Déplacez le code dans un fichier séparé, ne le copiez pas. –

Répondre

7

Voir https://developers.google.com/appengine/articles/deferred:

Limites de la bibliothèque différée

  • Vous ne pouvez pas appeler une méthode dans le module de gestionnaire de requêtes.

La fonction qui est appelée par l'intermédiaire d'deferred.defer ne doit pas être dans le même module comme le gestionnaire de requêtes où deferred.defer est appelée.

+0

OK, merci. J'ai utilisé 'taskqueue' avec' countdown' à la place et ça marche bien. –

Questions connexes