我正在编写一个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
}
答案 0 :(得分:1)
是的,就是这种情况。
你不能轻易地使用mod_python的腌制类,函数或类实例。
本文档从会话的角度描述了问题,但仍适用于您的用法: http://www.dscpl.com.au/wiki/ModPython/Articles/IssuesWithSessionObjects
基本问题:
问题和限制的来源是“pickle”序列化例程的操作如何受mod_python实现的模块重新加载机制的影响。也就是说,模块加载机制是Python * Handler指令的基础,也是由apache.import_module()函数实现的。已知受影响的特定数据类型是函数对象和类对象。
汇总:
为了确保不会发生任何奇怪的问题,建议只在会话对象中存储基本的内置Python类型,即标量,元组,列表和字典。也就是说,避免任何类型的对象具有与之关联的用户定义代码。