Ошибка травления Python при использовании сессий - PullRequest
3 голосов
/ 04 сентября 2010

В моем приложении django я создавал расширенный профиль пользователя, используя сессионные переменные.Но когда регистрационная форма была сохранена и пользователь собирался ее создать, я получил следующую ошибку:

Traceback (most recent call last):

  File "\Python26\Lib\site-packages\django\core\servers\basehttp.py", line 279, in run
    self.result = application(self.environ, self.start_response)

  File "\Python26\Lib\site-packages\django\core\servers\basehttp.py", line 651, in __call__
    return self.application(environ, start_response)

  File "\Python26\Lib\site-packages\django\core\handlers\wsgi.py", line 245, in __call__
    response = middleware_method(request, response)

  File "\Python26\Lib\site-packages\django\contrib\sessions\middleware.py", line 36, in process_response
    request.session.save()

  File "\Python26\Lib\site-packages\django\contrib\sessions\backends\db.py", line 53, in save
    session_data = self.encode(self._get_session(no_load=must_create)),

  File "\Python26\Lib\site-packages\django\contrib\sessions\backends\base.py", line 88, in encode
    pickled = pickle.dumps(session_dict, pickle.HIGHEST_PROTOCOL)

PicklingError: Can't pickle <type 'cStringIO.StringO'>: attribute lookup cStringIO.StringO failed

Я гуглил ответ, но ничего интересного не нашел.Есть ли обходные пути для этого?

Ответы [ 3 ]

4 голосов
/ 04 сентября 2010

Похоже, у вас есть объект cStringIO в вашем сеансе (возможно, загруженный файл?), Они не могут быть обработаны. Либо напишите собственный код выбора, либо убедитесь, что все данные сеанса можно сериализовать.

1 голос
/ 18 ноября 2010

В поддержку ответа Иво вот ссылка, которую я нашел, которая может объяснить это: http://bugs.python.org/issue5345

Это не опечатка.cStringIO.StringIO - это фабричная функция, которая возвращает либо объект cStringO (для записи), либо cStringI (для чтения).Если это вызывает у вас проблемы, рассмотрите возможность использования StringIO.StringIO.

В качестве альтернативы вы можете перейти на Python 2.7 или 3.0 и использовать io.StringIO (), у которого нет этого ограничения.

1 голос
/ 04 сентября 2010

Здесь происходит что-то странное, потому что ошибка относится к cStringIO.StringO, тогда как класс на самом деле cStringIO.StringIO, с дополнительным I. Вы где-нибудь ошиблись в названии?

...