目标:分析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>