Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 谷歌应用程序引擎键值错误_Python_Google App Engine - Fatal编程技术网

Python 谷歌应用程序引擎键值错误

Python 谷歌应用程序引擎键值错误,python,google-app-engine,Python,Google App Engine,我正在编写一个google应用程序引擎应用程序,在收到请求时出现了这个键值错误 从回溯中,我只是访问并导致密钥错误 self.request.headers 整个代码片段都在这里,我只是转发未修改的标题 response = fetch( "%s%s?%s" % ( self.getApiServer() , self.req

我正在编写一个google应用程序引擎应用程序,在收到请求时出现了这个键值错误

从回溯中,我只是访问并导致密钥错误

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