2010-09-04 49 views
3

在我的django应用程序中,我使用会话变量创建了一个扩展的用户配置文件。但是,当保存登记表和用户正要创造,我有以下错误:使用会话时Python酸洗错误

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 

我GOOGLE了一个答案,但一无所获有趣。任何解决方法?

+0

如果您可以发布您的代码,这将是有帮助的! – 2010-09-04 11:57:39

回答

4

看起来你的会话中有一个cStringIO对象(可能是一个上传的文件?),它们不能被腌制。要么编写自定义酸洗代码,要么确保所有的会话数据都可以被序列化。

+0

是的,我正在上传一个文件。 – 2010-09-04 12:27:37

1

一些奇怪的事情在这里,因为错误是指cStringIO.StringO,而类实际上是cStringIO.StringIO,有一个额外的一,你有地方拼错了名字?

1

在支持伊沃的回答,这里是一个参考,我发现这也许可以解释这一点:http://bugs.python.org/issue5345

这不是一个错字。 cStringIO.StringIO 是一个工厂函数,它返回 或cStringO对象(用于写入) 或cStringI(用于读取)。如果这种行为导致您的问题,则 考虑使用StringIO.StringIO。

或者,你可以升级到 的Python 2.7或3.0,并使用 io.StringIO(),它不具有此 限制。