Google应用引擎键值错误

时间:2010-06-22 15:03:36

标签: python google-app-engine

我正在编写一个谷歌应用引擎应用,并且在进入

请求时出现此键值错误

来自我只是访问的回溯并导致密钥错误

self.request.headers

整个代码段在这里,我只是转发未经修改的标题

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

并获取处理请求调用proxy()的方法

# 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

错误回溯:

'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'

知道它为什么会发生或者这是一个已知的错误吗?

4 个答案:

答案 0 :(得分:2)

这看起来很奇怪。 docs提到响应“当您尝试获取或删除不在包装头列表中的键时,Headers对象不会引发错误。获取不存在的头只返回None”。从request documentation if if.headers也是这个类的对象并不清楚,但即使它们是常规词典,iteritems似乎行为不端。所以这可能是一个错误。

在调用fetch之前检查self.request.headers可能是值得的,并且看1)它的实际类型,2)它的键,以及3)如果试图获得self.request.headers ['CONTENT_TYPE ']然后引发错误。

但是,如果您只想解决问题并继续前进,可以尝试绕过它:

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

(我建议将其设置为None,因为这是响应Header对象应该在不存在的键上返回的内容)

答案 1 :(得分:1)

以下是我对此问题的观察: 当content-type为application / x-www-form-urlencoded并且POST数据为空(例如jquery.ajax GET,twitter的最爱和转发API ...)时,Google appengine会删除内容类型。 您可以添加:

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

答案 2 :(得分:0)

编辑:的确,更仔细地查看错误,它似乎与convertParameters无关,正如OP在评论中指出的那样。我正在退出这个答案。

我不完全确定你的意思是“只是转发未经修改的标题”,但是在调用self.request.query_string之前和之后,您是否看过convertParameters?更重要的是,你要省略“key =”形式的任何(有效)GET参数(即具有空值的键)。

也许你的原始query_string有一个像“CONTENT_TYPE =”的值,你的convertParameters正在剥离它。

答案 3 :(得分:0)