apache下的python中的unpickling问题(mod_python)

时间:2011-05-20 13:45:56

标签: python apache pickle

我正在编写一个Web应用程序,它通过网络套接字与我在python中开发的服务器进行通信。为简化起见,我决定将数据打包成一个类并在酸洗后将其传输。

为了测试这个概念,我编写了一个代码来挑选类并解开它但不起作用的代码。相同的代码在python解释器中运行。以下是我得到的代码和错误:

class testClass:
    def __init__(self):
        self.blah       = 'bleh'
        self.meaning    = 42
        self.isComplete = False

    def dumpy(self):
        print self.blah
        print self.meaning
        print self.isComplete

def index():
    foo   = testClass()
    p_foo = pickle.dumps(foo)

    foo = pickle.loads(p_foo)

    foo.dumpy()

这是错误:

  

ImportError:没有名为的模块   _mp_11b334e84556201b42d59ca560e0f6ad

     

MODULE CACHE DETAILS

     

访问:5月20日星期五16:23:51
  2011年代:0

     

_mp_11b334e84556201b42d59ca560e0f6ad {
  FileName:'/ var / www / stststation-web /sea_monitor/management_client.py'   实例:1 [IMPORT]
  代:1   修改时间:2011年5月20日星期五16:23:47
  进口:2011年5月20日星期五16:23:51
  }

1 个答案:

答案 0 :(得分:1)

是的,就是这种情况。

你不能轻易地使用mod_python的腌制类,函数或类实例。

本文档从会话的角度描述了问题,但仍适用于您的用法: http://www.dscpl.com.au/wiki/ModPython/Articles/IssuesWithSessionObjects

基本问题:

  

问题和限制的来源是“pickle”序列化例程的操作如何受mod_python实现的模块重新加载机制的影响。也就是说,模块加载机制是Python * Handler指令的基础,也是由apache.import_module()函数实现的。已知受影响的特定数据类型是函数对象和类对象。

汇总:

  

为了确保不会发生任何奇怪的问题,建议只在会话对象中存储基本的内置Python类型,即标量,元组,列表和字典。也就是说,避免任何类型的对象具有与之关联的用户定义代码。