Ошибка на окнах при использовании сессии из appengine-утилит - PullRequest
4 голосов
/ 16 апреля 2010

Я столкнулся со странной проблемой при попытке перенести проект на компьютер с 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 (* группа) Файл "C: \ Development \ Byggmax.Affiliate \ bmaffiliate \ admin.py", строка 29, в get сессия = сессия () Файл "C: \ Development \ Byggmax.Affiliate \ bmaffiliate \ appengine_utilities \ sessions.py", строка 547, в init self.cookie.load (string_cookie) Файл "C: \ Python26 \ lib \ Cookie.py", строка 628, в загрузке для k, v в rawdata.items (): AttributeError: у объекта 'unicode' нет атрибута 'items'

Кто-нибудь знаком с обработчиком сеансов, знает что-нибудь об этом? Любая помощь приветствуется!

.. Фредрик

Ответы [ 2 ]

11 голосов
/ 16 апреля 2010

Ошибка довольно очевидна, если взглянуть на источники, хотя они совершенно не зависят от ОС. В 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 - это юникод (хотя это может быть байтовая строка из окружения, эти u"" означают, что автор sessions.py изо всех сил пытается получить его как юникод! -). Между тем в 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 явно , а не тот, для которого был создан этот sessions.py. Так что же могло случиться ...? Ну, мы, конечно, знаем, что App Engine строго Python 2.5, а Cookie.py, который мы показали, - это Python 2.6. Итак, давайте посмотрим на Cookie.py в 2.5 (строки 618-621 в этой версии):

    if type(rawdata) == type(""):
        self.__ParseString(rawdata)
    else:
        self.update(rawdata)

так что в 2.5, учитывая пустую строку в юникоде, cookie (который диктует подклассы) делает self.update(u'') ... что является безобидным no-op. Комментарий в 2.6 показывает, почему сопровождающий Cookie.py переключился на текущий цикл ... который прерывается, когда rawdata u''.

Короче говоря: установите Python 2.5 на свой компьютер с Windows и используйте эту версию с GAE SDK, не 2.6, которую вы используете в настоящее время - если вы действительно не любите отладка очень тонких различий версий, где неправильное использование было безобидным в 2.5, но ломается в 2.6, как этот ;-). Также введите ошибку об этом в трекер gaeutilities, так как этот вызов load с пустой строкой Unicode просто неверен, хотя в 2.5 это безобидно.

В частности, получите соответствующую Windows msi 2.5.4 из здесь , в зависимости от того, установлена ​​ли у вас 32-битная или 64-битная версия Windows.

1 голос
/ 16 апреля 2010

Перешел по ссылке на этот пост из номера, опубликованного на трекере проектов.Как я там писал, я отвечу, что не буду фокусироваться на применении обновлений, чтобы проект работал с Python 2.6.Тем не менее, я уделю немного больше внимания рассмотрению вызова для загрузки с пустой строкой Unicode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...