【问题标题】:Google app engine key value error谷歌应用引擎键值错误
【发布时间】:2010-06-22 15:03:36
【问题描述】:

我正在编写一个谷歌应用引擎应用程序,当请求进来时我有这个键值错误

从我刚刚访问并导致关键错误的回溯

self.request.headers

整个代码sn-p在这里,我只是转发未修改的标题

     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()的请求

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

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

【问题讨论】:

  • 这段代码在哪里?我们需要查看它所在的完整处理程序类。
  • 这对上下文足够了吗?

标签: python google-app-engine


【解决方案1】:

这看起来很奇怪。 docs 提到响应“当您尝试获取或删除不在包装的标头列表中的键时,标头对象不会引发错误。获取不存在的标头只会返回无”。从request documentation 中不清楚 request.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 对象应在不存在的键上返回的内容)

【讨论】:

  • 不,它不起作用,如果你尝试任何会遍历标题的方法,它会在过去的地方引发错误。
  • 听起来像一个错误。只是为了确保:您使用的是 App Engine 的最新版本,对吗?另外,请尝试设置 content_type 无论如何。即不查,只做self.request.headers['CONTENT_TYPE'] = None
  • overbooming:是否在不检查的情况下设置了 CONTENT_TYPE?请告诉我,我会编辑答案。谢谢! :)
【解决方案2】:

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

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

在 urlfetch 之前。

【讨论】:

    【解决方案3】:

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

    我不完全确定您所说的“仅转发未修改的标头”是什么意思,但是您在致电 convertParameters 之前和之后查看过 self.request.query_string 吗?更重要的是,您将遗漏任何(有效的)GET 参数形式为“key=”(即,具有空值的键)。

    也许您原来的 query_string 有一个类似“CONTENT_TYPE="的值,而您的 convertParameters 正在剥离它。

    【讨论】:

    • 我的想法中的 convertParameters() 与问题无关,根据我提供的回溯,当我对 self.request.headers 进行迭代时发生错误
    【解决方案4】:

    【讨论】:

    • 知道是因为 OP(他|她)自己打开了它:)。此外,解决方法链接到应该在 1.3.2 上修复的问题。当前版本是 1.3.5(我想/希望 OP 使用的是最新的应用引擎版本)
    • 看起来确实可能是由您的第二个链接指向的问题引起的。我希望 OP 使用的是最新的 SDK。
    猜你喜欢
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多