2010-06-22 6 views
2

Je suis en train d'écrire une application Google App Engine et j'ai cette erreur de valeur clé sur les demandes provenant demoteur Google app erreur de valeur clé

du backtrace j'accéder à une cause juste et l'erreur clé

self.request.headers 

extrait de code entier est ici, je les en-têtes, juste en avant non modifiés

 response = fetch("%s%s?%s" % (
             self.getApiServer() , 
             self.request.path.replace("/twitter/", ""), 
             self.request.query_string 
            ), 
         self.request.body, 
         method, 
         self.request.headers, 
        ) 

et obtenir méthode de gestion de la demande proxy() appelant

# handle http get 
def get(self, *args): 
    parameters = self.convertParameters(self.request.query_string) 
    # self.prepareHeader("GET", parameters) 
    self.request.query_string = "&".join("%s=%s" % (quote(key) , quote(value)) for key, value in parameters.items()) 
    self.proxy(GET, *args) 
def convertParameters(self, source): 
    parameters = {} 
    for pairs in source.split("&"): 
     item = pairs.split("=") 
     if len(item) == 2: 
      parameters[item[0]] = unquote(item[1]) 
    return parameters 

l'erreur retraçage:

'CONTENT_TYPE' 
Traceback (most recent call last): 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 513, in __call__ 
    handler.post(*groups) 
    File "/base/data/home/apps/waytosing/1.342850593213842824/com/blogspot/zizon/twitter/RestApiProxy.py", line 67, in post 
    self.proxy(POST, *args) 
    File "/base/data/home/apps/waytosing/1.342850593213842824/com/blogspot/zizon/twitter/RestApiProxy.py", line 47, in proxy 
    self.request.headers, 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/api/urlfetch.py", line 240, in fetch 
    allow_truncated, follow_redirects) 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/api/urlfetch.py", line 280, in make_fetch_call 
    for key, value in headers.iteritems(): 
    File "/base/python_runtime/python_dist/lib/python2.5/UserDict.py", line 106, in iteritems 
    yield (k, self[k]) 
    File "/base/python_runtime/python_lib/versions/1/webob/datastruct.py", line 40, in __getitem__ 
    return self.environ[self._trans_name(item)] 
KeyError: 'CONTENT_TYPE' 

Toute idée pourquoi il arrive ou est-ce un bug connu?

+1

Où est ce code? Nous devons voir la classe de gestionnaire complète dans laquelle il se trouve. –

+0

est-ce suffisant pour le contexte? – overboming

Répondre

2

Cela semble bizarre. La réponse docs mentionne cette réponse «Les objets d'en-tête n'entraînent pas d'erreur lorsque vous essayez d'obtenir ou de supprimer une clé qui ne figure pas dans la liste d'en-tête encapsulée. Ce n'est pas clair à partir du request documentation si request.headers sont aussi des objets de cette classe, mais même s'ils étaient des dictionnaires normaux, iteritems semble se conduire mal. Donc, cela pourrait être un bug.

Il peut être intéressant d'inspecter self.request.headers, avant d'appeler fetch, et voir 1) son type actuel, 2) ses clés, et 3) si vous essayez d'obtenir self.request.headers ['CONTENT_TYPE'] augmente une erreur alors.

Mais, si vous voulez simplement pour résoudre votre problème et aller de l'avant, vous pouvez essayer de le contourner comme:

if 'CONTENT_TYPE' not in self.request.headers: 
    self.request.headers['CONTENT_TYPE'] = None 

(je suggère la mise à Aucun, parce que ce réponse objet d'en-tête devrait retourner sur les clés inexistantes)

+0

Elégant si cela fonctionne. –

+0

Non, cela ne fonctionne pas, si vous essayez quelque chose qui va parcourir les en-têtes, il va augmenter l'erreur là où il était auparavant. – overboming

+0

Cela ressemble à un bug. Juste pour être sûr: vous utilisez la dernière version d'App Engine, n'est-ce pas? En outre, essayez de définir le content_type indépendamment. C'est-à-dire, ne pas vérifier, il suffit de faire 'self.request.headers ['CONTENT_TYPE'] = None' – rbp

0

Éditer: en effet, en regardant plus attentivement l'erreur, il ne semble pas être lié à convertParameters, comme le fait remarquer l'OP dans les commentaires. Je prends ma retraite de cette réponse.

Je ne suis pas tout à fait sûr de ce que vous entendez par "juste en avant les en-têtes non modifiés", mais avez-vous jeté un oeil à self.request.query_string avant et après avoir appelé convertParameters? Plus précisément, vous omettez tous les paramètres GET (valides) de la forme «key =» (c'est-à-dire les clés avec des valeurs vides).

Peut-être que la chaîne query_string d'origine avait une valeur comme "CONTENT_TYPE =", et votre convertParameters l'efface.

+0

convertParameters() dans mon idée n'est pas pertinent au problème, selon le backtrace que j'ai fourni, l'erreur se produit quand je fais itérer sur self.request.headers – overboming

0
+2

Il est connu parce que l'OP (lui |) auto l'a ouvert :) En outre, la solution de contournement renvoie à un problème qui doit être résolu sur 1.3.2. La version actuelle est 1.3.5 (je suppose/j'espère que l'OP utilise la dernière version du moteur de l'application) – rbp

+0

hrm. Oui vous avez raison. –

+0

Il semble vraiment que cela puisse être causé par le problème que votre deuxième lien pointe vers. J'espère que le PO utilise le dernier SDK. – rbp

1

Voici mon observation à propos de ce problème: Lorsque le type de contenu est application/x-www-form-urlencoded et que les données POST sont vides (par exemple, jquery.ajax GET, Twitter favori et Retweet API ...), le type de contenu est abandonné par Google appengine. Vous pouvez ajouter:

self.request.headers.update({'content-type':'application/x-www-form-urlencoded'}) 

avant urlfetch.

Questions connexes