Python 谷歌应用程序引擎键值错误
我正在编写一个google应用程序引擎应用程序,在收到请求时出现了这个键值错误 从回溯中,我只是访问并导致密钥错误Python 谷歌应用程序引擎键值错误,python,google-app-engine,Python,Google App Engine,我正在编写一个google应用程序引擎应用程序,在收到请求时出现了这个键值错误 从回溯中,我只是访问并导致密钥错误 self.request.headers 整个代码片段都在这里,我只是转发未修改的标题 response = fetch( "%s%s?%s" % ( self.getApiServer() , self.req
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,
)
和get方法处理调用proxy()的请求
错误返回跟踪:
'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'
知道为什么会发生这种情况或者这是一个已知的错误吗?编辑:事实上,更仔细地观察错误,它似乎与convertParameters无关,正如OP在评论中指出的那样。我要收回这个答案 我不完全清楚你所说的“未经修改只转发标题”是什么意思,但是你在调用
convertParameters
之前和之后是否查看了self.request.query\u string
?更重要的是,您省略了任何形式为“key=”(即具有空值的键)的(有效)GET参数
可能您的原始查询字符串有一个类似“CONTENT\u TYPE=”的值,您的convertParameters正在将其剥离出来。这里的已知问题和潜在解决方法这看起来很奇怪。提到响应“当您尝试获取或删除不在包装头列表中的键时,头对象不会引发错误。获取不存在的头只会返回无”。if request.header也是这个类的对象,但即使它们是常规字典,iteritems
似乎也有问题。所以这可能是一个bug
在调用fetch
之前,可能需要检查self.request.headers,并查看1)它的实际类型,2)它的键,以及3)如果试图获取self.request.headers['CONTENT\u type']则会引发错误
但是,如果您只是想解决问题并继续前进,您可以尝试绕过它,如:
if 'CONTENT_TYPE' not in self.request.headers:
self.request.headers['CONTENT_TYPE'] = None
(我建议将其设置为“无”,因为这是响应头对象在不存在键时应该返回的内容)以下是我对这个问题的观察: 当内容类型为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之前。此代码在哪里?我们需要查看它所在的完整处理程序类。这对于上下文是否足够?我认为convertParameters()与问题无关,根据我提供的回溯,错误发生在我迭代self.request.headersIt时,因为OP(他|她)self打开了它:)。此外,解决方案链接到一个问题,该问题应在1.3.2中修复。当前版本是1.3.5(我想/希望OP使用的是最新的应用程序引擎版本),它看起来确实可能是由您的第二个链接指向的问题引起的。我希望OP使用的是最新的SDK。不,它不起作用,如果你尝试任何可以遍历头的方法,它会在以前的地方引发错误。听起来像个bug。只是为了确保:您使用的是App Engine的最新版本,对吗?另外,请尝试设置内容类型。也就是说,不检查,只需执行
self.request.headers['CONTENT\u TYPE']=None
overbookming:不检查设置内容类型是否有效?请让我知道,我会编辑答案。谢谢!:)
self.request.headers.update({'content-type':'application/x-www-form-urlencoded'})