目标:分析plone中zodb数据库,能通过直接操作数据库对plone进行设置和显示
有关zodb数据的操作可参考:http://xiaolin0199.iteye.com/blog/2019678
由于zodb中的数据是以层次结构存储的,就像一个一个文件夹一样,而plone就是一个大的文件夹,里面还嵌套着很多个文件夹,现在就是要看看这个大文件夹的数据结构
现在以本地Plone为例,通过ZEO去连接数据库,就像打开文件夹一样,一步一步的进入文件夹查看内容
首先找到根目录
from ZEO.ClientStorage import ClientStorage
from ZODB import DB
from myzodb import MyZODB, transaction
class MyRemoteZODB(object):
def __init__(self, server, port):
server_and_port = (server, port)
self.storage = ClientStorage(server_and_port)
self.db = DB(self.storage)
self.connection = self.db.open()
self.dbroot = self.connection.root()
def close(self):
self.connection.close()
self.db.close()
self.storage.close()
mydb = MyRemoteZODB('localhost', 8100)
dbroot = mydb.dbroot
上面的代码就是通过本地端口8100的zeo访问zodb,而dbroot就是根目录,接着我们打开这个根目录
>>>print dbroot.keys()
['Application']
>>>application = dbroot['Application']
>>>print application.keys()
['Control_Panel', 'temp_folder', 'session_data_manager', 'browser_id_manager', 'error_log', 'favicon.ico', 'standard_error_message', 'index_html', 'virtual_hosting', 'MyPlone', 'acl_users']
>>>myplone = application['MyPlone']
>>>print myplone.keys()
['portal_setup', 'MailHost', 'caching_policy_manager', 'content_type_registry', 'error_log',...]
上面的代码相当于:
>>>ls dbroot
Application
>>>cd Application
>>>ls
'Control_Panel', 'temp_folder', 'session_data_manager', 'browser_id_manager', 'error_log', 'favicon.ico', 'standard_error_message', 'index_html', 'virtual_hosting', 'MyPlone', 'acl_users'
>>>cd MyPlone
>>>ls
'portal_setup', 'MailHost', 'caching_policy_manager', 'content_type_registry', 'error_log',...
结构比较清楚,跟zmi后台显示的是对应的,但里面的内容虽然显示的是字符串,但其实都是一个一个zope定义的类,要弄清这些类的添加使用就比较困难了
现在对一个简单的类测试下:
先在zmi后台/MyPlone目录下创建一个Page Template,名为mytest,里面默认显示的代码是
<html>
<head>
<title tal:content="template/title">The title</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
<h2><span tal:replace="here/title_or_id">content title or id</span>
<span tal:condition="template/title"
tal:replace="template/title">optional template title</span></h2>
This is Page Template <em tal:content="template/id">template id</em>.
</body>
</html>
现尝试通过直接操作zodb修改里面的代码
尝试步骤:
1.进入MyPlone,会发现刚创建的mytest
>>>myplone = application['MyPlone']
>>>print myplone.keys()
['portal_setup', 'MailHost', 'caching_policy_manager', 'content_type_registry', 'error_log',...'mytest']
2.赋值mytest,通过dir查看方法,发现有read和write的方法
>>>mytest = myplone['mytest']
>>>print mytest
<ZopePageTemplate at mytest>
>>>print mytest.read()
<html>
<head>
<title tal:content="template/title">The title</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
<h2><span tal:replace="here/title_or_id">content title or id</span>
<span tal:condition="template/title"
tal:replace="template/title">optional template title</span></h2>
This is Page Template <em tal:content="template/id">template id</em>.
</body>
</html>
>>>mytest.write("<html></html>")
>>>transaction.commit()
3.最后在zmi后台再查看totest,发现代码已经改变了
<html></html>