2010-09-04 3 views
3

В моем приложении 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 

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

+0

Было бы полезно, если бы вы также опубликовали свой код! –

ответ

4

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

+0

да, я загружаю файл. –

1

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

1

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

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

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