在Windows上使用appengine-utilities的会话时出错
我在把一个项目转移到Windows机器时遇到了一个奇怪的问题。
在我的项目中,我使用了一个会话处理器(http://gaeutilities.appspot.com/session),在我的Mac上运行得很好,但在Windows上却出现了以下错误:
追踪信息(最近的调用在最前面): 文件 "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\webapp__init__.py",第510行,在 call 中 handler.get(*groups) 文件 "C:\Development\Byggmax.Affiliate\bmaffiliate\admin.py",第29行,在 get 中 session = Session() 文件 "C:\Development\Byggmax.Affiliate\bmaffiliate\appengine_utilities\sessions.py",第547行,在 init 中 self.cookie.load(string_cookie) 文件 "C:\Python26\lib\Cookie.py",第628行,在 load 中 for k, v in rawdata.items(): AttributeError: 'unicode' 对象没有 'items' 属性
有没有人对这个会话处理器熟悉,知道怎么解决这个问题?任何帮助都非常欢迎!
..fredrik
2 个回答
我从项目的问题追踪器上看到这个帖子,所以点进来了。正如我在那儿说的,我不会专注于更新代码让这个项目能在Python 2.6上运行。不过,我会稍微多关注一下用空的unicode字符串来加载的这个调用。
这个问题看起来很明显,虽然和操作系统无关。在 sessions.py 的第544到547行:
string_cookie = os.environ.get(u"HTTP_COOKIE", u"")
self.cookie = Cookie.SimpleCookie()
self.output_cookie = Cookie.SimpleCookie()
self.cookie.load(string_cookie)
第544行很可能表明 string_cookie
是unicode格式的(虽然它也可能是来自环境的字节字符串,但那些 u""
表示 sessions.py
的作者努力想把它处理成unicode格式!)。与此同时,在 Cookie.py 的第624到628行:
if type(rawdata) == type(""):
self.__ParseString(rawdata)
else:
# self.update() wouldn't call our custom __setitem__
for k, v in rawdata.items():
第624行只处理字节字符串:其他任何类型(包括unicode字符串!)都被当作字典处理(这就是崩溃的原因)。
显然,这个 Cookie.py 不是为这个 sessions.py 开发的。那么可能发生了什么呢...? 我们当然知道,App Engine 是严格使用 Python 2.5,而我们提到的 Cookie.py 是 Python 2.6 的版本。所以我们来看看 2.5 版本的 Cookie.py(这个版本的第618到621行):
if type(rawdata) == type(""):
self.__ParseString(rawdata)
else:
self.update(rawdata)
在 2.5 中,给一个空的 unicode 字符串时,cookie(它是字典的子类)会执行 self.update(u'')
... 这实际上是一个无害的操作。2.6 中的注释说明了为什么 Cookie.py 的维护者切换到现在的循环... 这个循环在 rawdata 是 u''
时会出问题。
长话短说:在你的 Windows 机器上安装 Python 2.5,并使用这个版本的 GAE SDK,而不是你现在使用的 2.6 版本——除非你真的喜欢调试那些非常微妙的版本差异,因为在 2.5 中不正确的用法是无害的,但在 2.6 中就会出问题,就像这个例子一样;-)。另外,在 gaeutilities 的问题追踪器上报告一个bug,因为用空的 unicode 字符串调用 load
是错误的,尽管在 2.5 中这并不会出问题。
具体来说,从 这里 获取适合你 Windows 系统的 2.5.4 版本的安装包,具体取决于你是使用 32位还是 64位的 Windows。