【问题标题】:Error on windows using session from appengine-utilities使用来自 appengine-utilities 的会话在 Windows 上出错
【发布时间】:2011-02-08 19:36:30
【问题描述】:

我在尝试将项目转移到 Windows 机器时遇到了一个奇怪的问题。

在我的项目中,我使用了一个会话处理程序 (http://gaeutilities.appspot.com/session),它在我的 mac 上运行良好,但在 windows 上我得到:

Traceback(最近一次调用最后一次): 调用中的文件“C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\webapp__init__.py”,第 510 行 handler.get(*groups) 文件“C:\Development\Byggmax.Affiliate\bmaffiliate\admin.py”,第 29 行,在 get 会话 = 会话() init 中的文件“C:\Development\Byggmax.Affiliate\bmaffiliate\appengine_utilities\sessions.py”,第 547 行 self.cookie.load(string_cookie) 文件“C:\Python26\lib\Cookie.py”,第 628 行,正在加载 对于 rawdata.items() 中的 k、v: AttributeError: 'unicode' 对象没有属性 'items'

任何熟悉会话处理程序的人都知道这一点吗?欢迎所有帮助!

..弗雷德里克

【问题讨论】:

    标签: python google-app-engine session


    【解决方案1】:

    尽管完全独立于操作系统,但通过查看源代码,这个错误就很清楚了。在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 行仅解析 byte 字符串:其他任何内容(包括 unicode 字符串!)都被视为 dict(崩溃的原因)。

    显然,这个 Cookie.py 明显不是这个 session.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(它是 dict 的子类)会执行 self.update(u'')... 这是一个无害的无操作。 2.6 中的注释说明了为什么 Cookie.py 的维护者切换到当前循环...当 rawdata 的 u'' 时中断。

    长话短说:在你的 Windows 机器上安装 Python 2.5,并使用带有 GAE SDK 的那个版本,不是你当前使用的 2.6 -- 除非你真正喜欢调试极其细微的版本差异,其中不正确的使用在 2.5 中是无害的,但在 2.6 中会中断,就像这个;-)。还要在 gaeutilities 跟踪器中输入一个关于此的错误,因为使用空 unicode 字符串调用 load 是完全错误的,即使在 2.5 中它恰好是无害的。

    具体来说,从here 获取适当的 Windows msi 2.5.4,具体取决于您使用的是 32 位还是 64 位版本的 Windows。

    【讨论】:

    • 哇!谢谢。到目前为止我在 stackoverflow 上看到的最佳解决方案/答案。
    • 如果我没记错的话,这里有一个操作系统依赖:Linux上的环境使用字节串,而Windows使用unicode。
    【解决方案2】:

    从发布在项目问题跟踪器上的问题中点击指向此帖子的链接。正如那里发布的那样,我的回应是我不会专注于应用更新以使项目与 Python 2.6 一起工作。但是,我将更加强调查看使用空 unicode 字符串加载的调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-18
      • 2018-07-03
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      • 2023-01-16
      相关资源
      最近更新 更多