2010-07-01 3 views
1

Salut tout le monde. J'utilise Appengine/Python et je n'ai pas été en mesure de corriger un bug BadKeyError pendant les 5 dernières heures Je me demande si quelqu'un peut m'aider à le comprendre. La partie de l'application à l'origine du bogue est un contrôleur qui traite les votes effectués par les utilisateurs. Actor_id est la clé de l'utilisateur et object_id est la clé de l'objet en cours de vote .Comment puis-je corriger ce bug? BadKeyError: Le nom doit être le type de chaîne

J'ai testé l'application en se cachant et restaurer un peu de code, et je sais pour sûr que les clés étant reçues sont bonnes (premier bloc), et que les entités sont créées (deuxième bloc). Ce qui ne fonctionne pas est la création d'une instance d'activité - soulève BadKeyError (troisième bloc)

J'ai ajouté le code du contrôleur, le code du modèle et le retraçage de l'erreur de la page du journal.

# Controller Code 

class ActivityHandler(FacebookEnabled): 
    def get(self): 

     # i.e. fbid/headline id/upvote. This works 
     actor_id = self.request.get('actor_id') 
     object_id = self.request.get('object_id') 

     # creating actor and object from keys (actor_id and object_id). 
     # This works. 
     actor = models.Person.get(actor_id) 
     object = models.Headline.get(object_id) 
     logging.info("Actor " + str(actor) +": " + str(actor.name) + 
      " object " + str(object) + ": " + str(object.title)) 

     # THIS IS WHAT SEEMS TO RAISE AN EXCEPTION 
     activity = models.Activity(actor, object, action='upvote') 
     activity.put() 

# Model Code 
class Activity(polymodel.PolyModel): 
# User causing the action i.e. a person 
    actor = db.ReferenceProperty(Person, required=True, 
    collection_name='actors') 

    # The object being the subject of the action i.e. headline 
    object = db.ReferenceProperty(Headline, required=True, 
     collection_name='objects') 

    # The action being made 
    action = db.StringProperty(required=True, choices=['upvote','downvote'], 
     default='upvote') 

Traceback

Name must be string type, not Headline 
Traceback (most recent call last): 
File "/base/python_runtime/python_lib/versions/1/google/appengine/ 
ext/webapp/__init__.py", line 511, in __call__ 
    handler.get(*groups) 
File "/base/data/home/apps/libnentest/2.343063076026692316/main.py", 
line 125, in get 
    activity = models.Activity(actor, object, action='upvote') 
File "/base/python_runtime/python_lib/versions/1/google/appengine/ 
ext/db/__init__.py", line 726, in __init__ 
    key_name.__class__.__name__) 
BadKeyError: Name must be string type, not Headline 
+0

Dans cet exemple, ActivityHandler et Activity apparaissent dans un fichier et une activité non spécifiés dans un module appelé 'models.py'. Il est important de faire cette distinction en particulier lors de la publication de NameErrors. – msw

Répondre

2

object est toujours un mauvais choix de nom et pourrait bien causer l'exception.

+0

Merci. Tu as raison. Ça marche maintenant. –

1

Le constructeur de PolyModel est comme ceci: class PolyModel(parent=None, key_name=None, **kwds): Donc vous passez dans l'objet global comme key_name, qui ressemble à elle doit être une chaîne de la stacktrace .

De la lecture à travers le docs je pense que ce que vous voulez faire est la suivante:

activity_kwargs = { 
    'actor' : actor, 
    'object' : object', 
    'action' : 'upvote', 
} 
activity = models.Activity(**activity_kwargs) 
activity.put() 

Sur une note latérale: Ne pas utiliser object comme nom de variable, car il est un mot-clé intégré.

+0

Je pense que c'était l'objet. Merci d'avoir noté ce sdolan. –

Questions connexes