我正在编写一个谷歌应用引擎应用,并且在进入
请求时出现此键值错误来自我只是访问的回溯并导致密钥错误
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'
知道它为什么会发生或者这是一个已知的错误吗?
答案 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)