1 概述

Zope和CMF都是Plone需要的核心技术。

Zope是由Python编写的,他是一个强大的面向对象的、开源的编程语言,他和Perl及Tcl比较类似。使用Plone,甚至基本的管理,都不需要Python的知识;然而,定制产品和Plone上脚本编程是需要一些Python知识的。

如果你打算使用Plone做一些复杂的事情,就需要花1-2天学习Python的基础知识。这不仅将让你能更充分地定制Plone,而且他将让你熟悉这些对象,以及他们如何在Plone环境中相互作用。

幸运的是,Python是一个非常容易学习的编程语言;一般,一个熟练的编程人员一天便可完全掌握他。新的编程人员稍微长些。如果你在Windows或者Mac上安装Plone,Python的正确版本灰自动安装上。如果要在几乎任意的操作系统中,独立地下载安装Python,请到 http://www.python.org.

掌握Python的最佳方法是在一个命令行的Python解释器中试用他。如果你有Plone的一个Windows安装程序,会有一个到Pythonwin链接,他是一个Python的集成开发环境(IDE)。你可以在“开始”菜单中找到它:开始 - 程序 - Plone - Pythonwin (图 1-2).

2 安装

   下载地址:http://plone.org/products/plone

   

启动后登录的用户名与密码是:admin, password

一些配置文件位于:E:\java\Plone 3\Data\etc

3 模板

当你向Plone请求一个“统一资源定位符”(URL)的时候,Plone环境中的一个对象被调用了。Plone通过把URL翻译成一个路径,来完成这个过程。因此,如果URL是 /Plone/login_form, Plone就会把这个URL分割为一个路径,并因此在对象数据库中查看每个对象。他首先寻找 Plone 对象,再在 Plone 对象内部寻找 login_form 对象。这个路径查询的过程,叫做 变量traversal; 在本质上,zope遍历了这些对象,然后调用了路径中的最后一个对象。如果你在浏览器中调用URL: /Plone/Members/login_form ,那么上下文就变成了 /Plone/Members. Plone和Zope整个发布系统中,有一个精妙之处,叫做 获取(acquiaition). 获取后面的概念是一种容器包含关系:对象被放置在叫做 容器 的其他对象中。在前面的例子中, andy 对象是一个容器,它位于 Members 容器中,然后位于Plone网站容器中(它有反过来位于Zope应用容器中).

在一个标准的面向对象环境中,一个对象继承了它父对象的行为。在Plone和Zope中,一个对象也继承了它的容器的行为。一个对象可以查找整个容器层次结构,以计算出如何得到这个行为。

4 Python

     一句话,javascript只适合客户端,python既适合客户端也适合服务端而已。

Python是一门优雅而健壮的编程语言,它继承了传统编译语言的强大性和通借鉴了简单脚本和解释语言的易用性。它可以帮你完成工作,而且一段时间以后,你还能看明   

白自己写的这段代码。你会对自己如此快地学会它和它强大的功能感到十分的惊讶,更不用提你已经完成的工作了!只有你想不到,没有Pytyon做不到。

类似于JAVA,它实际上是字节编译的,其结果就是可以生成一种近似机器语言的中间形式,这不仅改善了它的性能,还同时使它保持了解释型语言的优点。它的源代码通常以.py为扩展名,由于调用方式的不同,源文件会被编译成带有.pyc.pyo扩展名的文件.

 

下面讲讲,如何在Windows下方便地进入命令行运行程序

在windows下的cmd窗口中执行python程序,我一般是这样做:

1. 执行一个reg文件,内容为:

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Directory\shell\cmd\command]
@="cmd.exe /k \"cd %L\""

它的作用是在你的资源管理器上的右键菜单上增加一个菜单,名字为cmd。那么以后你在目录栏中点击一个目录,然后点右键,再执行这个cmd菜单,就会直接进入这个目录的命令行。

2. 因为已经进入了你的python程序所在的目录,因此直接在命令行下运行:

Python yourprog.py

即可。

前提是你已经将 Python 的安装目录加到 PATH 的环境变量中。

 

4.1 Python与其他语言比较

然而,往往因为Python是一门解释型语言,你会发现大多数的比较是在Perl、Java、Tcl,还有 JavaScript 之间进行的。Perl 是另外一种脚本语言,远远超越了标准的 shell 脚本。像Python一样,Perl赋予了你所有编程语言的功能特性,还有系统调用能力。 Perl最大的优势在于它的字符串模式匹配能力,其提供了一个十分强大的正则表达式匹配引擎。这使得Perl实际上成为了一种用于过滤、识别和抽取字符串文本的语言,而且它一直是开发 Web 服务器端 CGI(common gateway interface,通用网关接口)网络程序的最流行的语言。Python的正则表达式引擎很大程度上是基于Perl的。 然而,Perl语言的晦涩和对符号语法的过度使用,让解读变得很困难。这些语法令初学者不得精要,为他们的学习带来了不小的阻碍。Perl的这些额外的“特色”使得完成同一个任务会有多个方法,进而引起了开发者之间的分歧和内讧。最后,通常当你想阅读几个月前写的Perl脚本的时候都不得不求助参考书。 Python 也经常被拿来和 Java 作对比,因为他们都有类似的面向对象的特性和语法。Java的语法尽管比C++简单的多,但是依旧有些繁琐,尤其是当你想完成一个小任务的时候。Python的简洁比纯粹的使用Java提供了更加快速的开发环境。在Python和Java的关系上,一个非常重大的革命就是 Jython 的开发。Jython 是一个完全用 Java 开发的 Python 解释器,现在可以在只有Java虚拟机的环境中运行Python程序。我们会在后面的章节中简单讲述Jython的更多优点,但是现在就可以告诉你:在 Jython 的脚本环境中,你可以熟练地处理 Java 对象,Java可以和 Python 对象进行交互,你可以访问自己的 Java 标准类库,就如同 Java 一直是 Python环境的一部分一样。

JavaScript 是另外一种非常类似Python的面向对象脚本语言。优秀的JavaScript程序员学起Python来易如反掌。 聪慧的读者会注意到JavaScript是基于原型系统的,而Python则遵循传统的面向对象系统, 这使得二者的类和对象有一些差异

我们在上一节中曾经提到, 还有一个可以用的 Python解释器是完全由Java写成的, 名为 Jython。 尽管两种解释器之间存在一些细微的差别, 但是它们非常接近, 而且启动环境也完全相同。那Jython 又有哪些优势呢? Jython...

l         只要有Java虚拟机, 就能运行Jython

l         拥有访问Java包与类库的能力

l         为Java开发环境提供了脚本引擎

l         能够很容易的测试Java类库

l         提供访问Java原生异常处理的能力

l         继承了JavaBeans特性和内省能力

l         鼓励Python到Java的开发(反之亦然)

l         GUI开发人员可以访问 Java 的 AWT/Swing 库

l         利用了Java原生垃圾收集器(CPython未实现此功能)

4.2 Python语言基础(没说明的就是和JAVA语法一样)

下划线(_)在解释器中有特别的含义,表示最后一个表达式(注意不是语句)的值。所以上面的代码执行之后,下划线变量会包含字符串

Pythonprint语句,与字符串格式运算符( % )结合使用,可实现字符串替换功能,这一点和 C 语言中的printf()函数非常相似: >>> print "%s is number %d!" % ("Python", 1) 

 

下面是一个将输出重定向到日志文件的例子:

logfile = open('/tmp/mylog.txt', 'a')

print >> logfile, 'Fatal error: invalid input!'

logfile.close()

 

从键盘输入数据:>>> user = raw_input('Enter login name: ') 

 

获得帮助:help(raw_input)

 

注释是以“#”号开头

4.2.1 运算符

Python有两种除法运算符,单斜杠用作传统除法,双斜杠用作浮点除法(对结果进行四舍五入)。传统除法是指如果两个操作数都是整数的话,它将执行是地板除(取比商小的最大整数)(关于“地板除”请参考第5章——译者注),而浮点除法是真正的除法,不管操作数是什么类型,浮点除法总是执行真正的除法。你可以在第五章(数字)学到更多有关传统除法、真正的除法及浮点除法的知识。

Python当然也有标准比较运算符, 比较运算根据表达式的值的真假返回布尔值:

 <       <=      >       >=      ==      !=      <>

Python也提供了逻辑运算符:

and    or      not

4.2.2 变量和赋值

大小写敏感。

Python是动态类型语言, 也就是说不需要预先声明变量的类型。

 

Python支持五种基本数字类型,其中有三种是整数类型。

 int (有符号整数)          

long (长整数)          

bool (布尔值)          

float (浮点值)         

complex (复数

Python的长整数所能表达的范围远远超过C语言的长整数, 事实上,

Python长整数仅受限于用户计算机的虚拟内存总数。如果你熟悉 Java, Python的长整数类似于 Java 中的BigInteger 类型     

其实还有第六种数字类型, decimal 用于十进制浮点数。不过它并不是内建类型, 你必须先导入 decimal 模块才可以使用这种数值类型。 由于需求日渐强烈, Python 2.4增加了这种类型

 

Python 中字符串被定义为引号之间的字符集合。Python 支持使用成对的单引号或双引号,三引号(三个连续的单引号或者双引号)可以用来包含特殊字符。使用索引运算符( [ ] )和切片运算符( [ : ] )可以得到子字符串。字符串有其特有的索引规则:第一个字符的索引是 0,最后一个字符的索引是 1

4.2.3 列表和元组

可以将列表和元组当成普通的“数组”,它能保存任意数量任意类型的Python对象。和数组一样,通过从0开始的数字索引访问元素,但是列表和元组可以存储不同类型的对象。 列表和元组有几处重要的区别。列表元素用中括号( [ ])包裹,元素的个数及元素的值可以改变。元组元素用小括号(( ))包裹,不可以更改(尽管他们的内容可以)。元组可以看成是只读的列表。通过切片运算( [ ] [ : ] )可以得到子集,这一点与字符串的使用方法一样。

即小括号包着的是元组,中括号包着的是列表,元组不能被修改,列表则可以。

4.2.4 字典

就是哈希,用大扩号包着的。

>>> aDict = {'host': 'earth'} # create dict

>>> aDict['port'] = 80 # add to dict

>>> aDict

{'host': 'earth', 'port': 80}

>>> aDict.keys()

['host', 'port']

>>> aDict['host']

'earth'

>>> for key in aDict:

... print key, aDict[key]

...

host earth

port 80

4.2.5 代码块及缩进

代码块通过缩进对齐表达代码逻辑而不是使用大括号,因为没有了额外的字符,程序的可读性更高。而且缩进完全能够清楚地表达一个语句属于哪个代码块。当然,代码块也可以只有一个语句组成。 对一个Python初学者来说, 仅使用缩进可能令他诧异。 人们通常竭力避免改变, 因此对那些使用大括号很多年的人来说, 初次使用纯缩进来表示逻辑也许会多少感到有些不够坚定。(不用大括号?到底成不成啊?)。然而回想一下, python有两大特性, 一是简洁,二是可读性好。如果你实在讨厌使用缩进作为代码分界, 我们希望你从现在开始,半年后再来看一下这种方式。也许你会发现生活中没有大括号并不会象你想像的那么糟糕。

4.2.6 语句

If , while等语句后面都有一个冒号。

>>> counter = 0

>>> while counter < 3:

... print 'loop #%d' % (counter)

... counter += 1

 

>>> for item in ['e-mail', 'net-surfing', 'homework',

'chat']:

... print item

对字符串来说, 很容易迭代每一个字符。

>>> foo = 'abc'

>>> for c in foo:

...     print c

range()函数经常和len()函数一起用于字符串索引。 在这里我们要显示每一个元素及其

索引值:

>>> foo = 'abc'

>>> for i in range(len(foo)):

... print foo[i], '(%d)' % i

...

a (0)

b (1)

c (2)

不过, 这些循环有一个约束, 你要么循环索引, 要么循环元素。这导致了enumerate()

函数的推出(Python2.3新增)。 它同时做到了这两点:

 

>>> for i, ch in enumerate(foo):

... print ch, '(%d)' % i

...

a (0)

b (1)

c (2)

4.2.7 列表解析

4.2.8 文件操作

   ilename = raw_input('Enter file name: ')

fobj = open(filename, 'r')

for eachLine in fobj:

print eachLine,

fobj.close()

4.2.9 错误和异常

try:

filename = raw_input('Enter file name: ')

fobj = open(filename, 'r')

for eachLine in fobj:

print eachLine, fobj.close()

except IOError, e:

print 'file open error:', e

4.2.10 函数

   定义函数:

def addMe2Me(x):

        'apply + operation to argument'

        return (x + x)

4.2.11

    class ClassName(base_class[es]):

        "optional documentation string" 

        static_member_declarations 

        method_declarations

4.2.12 模板

模块是一种组织形式, 它将彼此有关系的Python代码组织到一个个独立文件当中。

模块可以包含可执行代码, 函数和类或者这些东西的组合。

4.2.13 语法和句法

Python语句中有一些基本规则和特殊字符:  

l         井号(#)表示之后的字符为 Python 注释  

l         换行 (\n) 是标准的行分隔符(通常一个语句一行)  

l         反斜线 ( \ ) 继续上一行  

l         分号 ( ; )将两个语句连接在一行中  

l         冒号 ( : ) 将代码块的头和体分开  

l         语句(代码块)用缩进块的方式体现  

l         不同的缩进深度分隔不同的代码块  

l         Python文件以模块的形式组织

4.2.14 第一个程序实例

#!/usr/bin/env python

 

'makTextFile.py -- crate text file'

 

import os

ls = os.linesep

 

#get filename

fname = raw_input('input filename please: ')

done = False

while not done:

    if os.path.exists(fname):

        print "ERROR: '%s' already exists" % fname

        break

    else:

        print 'get file content'

        all = []

        print "\nEnter lines ('.' by itself to quit).\n"

        while True:

            entry = raw_input('please input content:')

            if entry =='.':

                break

            else:

                all.append(entry)

        print 'write line to file'

        fobj = open(fname,'w')

        fobj.writelines(['%s%s' % (x,ls) for x in all])

        fobj.close()

        done = True;

        print "DONE!"

4.2.15 相关模块和开发工具

l         Debugger: pdb  

l         Logger: logging  

l         Profilers: profile, hotshot, cProfile

4.3 Python对象

所有的Python对像都拥有三个特性:身份,类型和值。一个对象都有一个唯一的身份标识自己,任何对象的身份可以使用内建函数id()来得到。您可以用内建函数type()查看Python对象的类型。

4.3.1 Python对象

None, Python Null 对象,相当于void

4.3.2内部类型

 代码    

   

跟踪记录 

切片 

省略  

Xrange

代码对象是编译过的Python源代码片段,它是可执行对象。通过调用内建函数compile()

可以得到代码对象。代码对象可以被 exec 命令或 eval()内建函数来执行。在第 14 章将详细研究代码对象。代码对象本身不包含任何执行环境信息, 它是用户自定义函数的核心, 在被执行时获得上下文。(事实上代码对象是函数的一个属性)一个函数除了有代码对象属性以外些其它函数必须的属性,包括函数名,文档字符串,默认参数,及全局命名空间等等。

帧对象表示 Python 的执行栈帧。帧对象包含Python解释器在运行时所需要知道的所有信息。它的属性包括指向上一帧的链接,正在被执行的代码对象(参见上文),本地及全局名字空间字典以及当前指令等。每次函数调用产生一个新的帧,每一个帧对象都会相应创建一个 C

4.3.3标准类型内建函数

cmp(obj1, obj2)    比较 obj1 obj2, 根据比较结果返回整数 i:

repr(obj) `obj` 返回一个对象的字符串表示

str(obj)           返回对象适合可读性好的字符串表示

type(obj)         得到一个对象的类型,并返回相应的type对象

4.3.4不支持的类型

char byte: Python没有 char byte 类型来保存单一字符或8比特整数。你可以使用长度为1的字符串表示字符或8比特整数。

指针:Python 替你管理内存,因此没有必要访问指针。在 Python 中你可以使用 id()函数得到一个对象的身份号, 这是最接近于指针的地址。因为你不能控制这个值,所以其实没有太大意义。其实在Python中, 一切都是指针。

4.4 Python访问数据库

4.5 Jython

Jython是一种可以把两种不同的编程语言结合在一起的工具。首先,它使Python程序员介入到Java开发环境并让他们能快速开发方案原型,以便无缝地集成到现有的Java平台上。Jython 提供了 Python 的大部分功能,以及实例化 Java 类并与 Java 类交互的功能。Jython 代码被动态地编译成Java字节码,因此,你可以用Jython扩展Java类。也可以用Java来扩展Python。在Python中写一个类,像使用Java类一样使用这个类是很容易的事情。你甚至可以把Jython脚本静态地编译为Java字节码。

 安装:java -jar jython_installer-2.2.1.jar

 再双击安装目录下的jython.bat就可以运行程序了。

Jython交互解释器的一个更有趣的方面就是,现在,你可以用Java来写“Hello

World!”了:

 >>> from java.lang import System

>>> System.out.write('Hello World!\n') 

Hello World!

 

运行例子,先将安装目录加入到环境变量PATH中,然后直接在命令行中到例子所在目录运行:jython example.py即可

4.5.1JAVA里运行脚本

在Jython的源包jython.jar中,包含了一种最基本的脚本解释器:PythonInterpreter。代码如下:

Java代码

  1. PythonInterpreter interp = new PythonInterpreter();  
  2.       interp.execfile("./script/listing.py");  

 

除此之外,还可以使用JSR223,JDK1.6已经包含了该扩展包。JSR223是一个用于解析多种脚本语言的库包,其中包括Jython。除了JSR223包之外,还需要jython-engine.jar包。代码如下:

Java代码

  1. ScriptEngine engine = new ScriptEngineManager().getEngineByName("python");  
  2. try  
  3. {  
  4.     engine.eval(new FileReader("./script/listing.py"));  
  5. }  
  6. catch(ScriptException se)  
  7. {  
  8.       
  9. }  
  10. catch(IOException ie)  
  11. {  
  12.       
  13. }  

5 Zope

ZopeZ Object Publishing Environment,它既是http服务器,又是数据库,又包含脚本编程语言。Zope是一种支持多种平台开源的Web应用服务器软件,它提供了完善 的功能和强大的动力,适用于构建各种类型的Web应用,从小型网站到企业级分布式网络应用都有Zope的用武之地。Zope在许多方面都超过了ASP PHPJSP等传统方法,是一套优秀而完整的解决方案。本专题详述Zope的应用开发,带您领略Zope的强大功能。

参考资料:Zope应用开发指南 http://os.51cto.com/art/200602/21544.htm

 

Zope(Z Object Publishing Environment)是一款网站建设工具,它是建立在服务或发布对象的基础上,而不仅仅上增加网页内容。Zope的支持者们相信,这款软件是对传统网 站建设工具和应用服务器的挑战,比如,ColdFusion和网景应用服务器。另外,Zope软件是免费并且开发源代码的。

Zope的软件开发人员将Zope设计成一款对象发表软件。他们的设想是让用户直接和实时对象交互,而不是传统上的和被服务的动态更新文件打交道。 Zope组件包括一个发布向导,它负责使用稳定的Zope CGI协议发布对象;另一个组件是被Zope视为文件夹,文件和图形框架的内建框架;组件之三是支持动态也产生的模板;组件之四是对象数据库。因为 Zope有SQL语言和数据库适配器的支持,所以它可以实现和传统数据库的互交功能,如微软的SQL Server。通常情况下,Zope对象数据库使用文件操作系统来管理数据。但是,Zope同时也支持关系数据库。像Oracle、Sybase、 MySQL和Open Database Connectivity它都支持。 

Zope的大部分代码是用Python语言写成的,Python是一种具有很强的交互性,类似于java的面对对象编程语言。同时,为了提供系统的系统,也采用了少量的c代码。同时,Zope可以运行于大多数的操作系统平台。

Zope是一个开源的web应用服务器,主要用python写成;它是一个事务型的对象数据库平台。Zope是一种支持多种平台的Web应用服务器 软件,它提供了完善的功能和强大的动力,适用于构建各种类型的Web应用,从小型网站到企业级分布式网络应用都有Zope的用武之地。Zope在许多方面 都超过了ASP、PHP、JSP等传统方法,是一套优秀而完整的解决方案。

Zope除了能储存内容,数据外,还能存放动态的HTML模板、脚本、搜索引擎、关系数据库管理系统(RDBMS)接口和代码。

Zope里的一切都是对象。它有一个强大的基于web的在线开发模板,使你能在世界上任何地方,任何时间方便地更新你的网站。作为对以上功能的安全保障,zope提供了一个集成的安全模型,能方便对数据库的内容进行分层授权管理。可以把个人的内容分配给个人用户管理,部门的内容分配给部门管理员管理,整个网站的内容由系统管理员管理。

现在基于Zope平台已开发出了大量的产品,能方便地嵌入zope中以扩展它的基本功能。Zope3已发布,这是一个全新设计的Web开发架构。采用组件和接口技术,实现Web应用的快速开发和布署。

Zope成为产品的技术就是基于 Web 从根本上来说是面向对象的。Zope 中的对象是层次型的,就像我们熟悉的一些概念一样,例如文件夹,文档,图象,SQL 查询语句。 Zope 的层次环境里,URL根据名字映射为其中的对象。例如URL"/Marketing/index.html",映射为文件夹对象"Marketing" 下面名为“index.html”的文档对象。

Zope 对象的建立和管理十分方便,只要打开浏览器,进入管理界面,所有管理和应用开发界面都可以通过浏览器来完成,界面就像 Windows 的资源管理器。通过这个界面,开发人员不必存取服务器上的文件系统就可以创建Zope 对象或者定义新的对象类型。
象可以放到对象层次的任意地方。网站管理员可以点击目录栏得到对象的不同视图,这些视图视对象类型不同而不同,对于 DTML 文档,可以有 “Edit”用来编辑文档源码,而数据库连接对象则让你修改连接字符串或者缓冲参数。所有的对象都有安全视图以控制存取权限。
Zope 对象存放在高性能的事务型对象数据库中,可以采用文件系统或者关系数据库作后台存储。每一个Web 请求作为对象数据库中分离的事务,如果应用中发生错误,请求事务就会自动回滚。同时,对象数据库还提供多级回退。网站管理员可以点击鼠标取消曾经做过的操 作。Zope 框架让所有细节和事务对应用开发人员都透明。

Zope 的心脏就是 DTML (文档模板标记语言),这个功能强大的变量插入和表达语言,提供对 Zope 对象的安全脚本和动态内容产生。

Zope 的数据源可以包括关系数据库,以及非关系型的 LDAP/IMAP 等。 Zope 支持常见的关系型数据库,包括Oracle, Sybase, MySQL 以及大多数 ODBC 兼容的数据库。
   为了存取后台数据,你需要建立一个数据库连接对象,然后建立 SQL 方法对象,这个对象能使用 DTML ,能很方便的建立动态的查询语句。下面建立的 getTasks 对象是从"tasks"表中选出对应用户的任务:

-----------------------------------------------
select * from tasks
where
emp_id='<!--#var AUTHENTICATED_USER-->'
-----------------------------------------------
结果集的数据应用于 DTML 文档:
-----------------------------------------------
<h2><!--#var AUTHENTICATED_USER--> 的任务</h2>
<table>
<!--#in getTasks-->
<tr>
<td><!--#var title--></td>
<td><!--#var due_date--></td>
</tr>
<!--#/in-->
</table>
--------------------------------------------

Zope 开发环境的另外一个好处就是它的事务模型能自动延伸到后台数据库,如果你的关系型数据库支持事务,Zope 会在运行SQL 方法之前自动开始事务,而在 Web 请求成功结束后自动提交事务,如果其中发生错误则会自动回滚,使事务的集成对Web 开发人员完全透明。

Zope 的强大功能之一就是它简单而成熟的数据共享模型,这个模型叫做获取,核心的概念可以简单的描述为:
Zope 对象包含于其它对象中(例如,文件夹)
对象能够获取容器中的属性,内容,行为。

以前,我们决定把我们网站的头和脚封装到分离的 DTML 文档,这样能包含其他网站的内容,但是这个设计在拷贝头和脚到网站内所有的文件夹时发生了问题。如果我们采取获取的办法,在网站的顶层文件夹建立头和脚,下层的 DTML 就能自动获取 这个概念对所有的对象都适用,对把常用的资源集中起来十分有用。例如,对一个经常用到的 SQL 查询语句,我们可以把它定义在一个文件夹里,子文件夹里的对象能自动通过获取来使用它,如果要改变查询语句,只需要改动一个地方就可以了。

Zope的特点是把文件和文件夹作为基本的对象,每个文件和文件夹都可以随意增加属性,同时,文件夹下面的文件和文件夹又是父文件夹的属性。通过增加脚本 文件的形式,可以为文件和文家夹增加方法。比如,一个文件可以加入作者分类难度等级等属性,文件夹也可以加入显示此文件夹下所有文件内 的方法。

Zope的现在的缺点是,不能直接使用外部文件,还要通过ftp复制到数据库中。现在有对这方面的补救措施,但不是Zope默认的。希望Zope将来能象操作自己的对象一样操作外部文件和其他网站的文件。

网站中数据库中主要的数据是文档,Zope作为文档数据库,有强大的文档管理功能,有版本管理、历史记录功能,有全文检索功能。同时集成了文档的编辑环境和管理环境,管理文档象在文件管理器中一样方便。这些都是一般的数据库所不具备的。

如果,数据库中有上万条记录,Zope的效率会比传统数据库要低,但Zope有大量的适配器来链接各种数据库。来实现纯表格操作和大量的记录操作。

Zopedtml(动态模板标记)语言来嵌入HTML中,实现网页的动态化。简单地使用地形式就可以插入动态内容。由于可以方便地加入属性和方法以及获取功能,文档具有极为丰富的变量环境。可以比一般的客户端包含提供更强大的功能。又有的形式来方便地获取多个文件地内容。在dtml中还可以嵌入 Python表达式。这样,不用编程就具有强大的动态网页功能,实现导航功能等也轻而易举。这些功能的实现比PHP等语言要容易的多。

Perl爱好者有福了。在这里可以直接用sql操作数据库,免去了把sql嵌入其他语言的麻烦。

6 plone

Zope/Plone 1、免费,不用花一分钱; 2、有真正免费的汉化包,不会有什么汉化者logo强行挤占页面; 3Plone是面向最终用户的,无需编程; 4、非编程不可,用ZopePython都是很简单的。

Plone有一个非常好的产品开发工具Archetypes
Plone是python写的,国内虚拟主机基本找不到支持的

6.1 plone站点数据史保存在什么地方,怎样备份和移植plone站点?

Plone站点所有内容是保存在 Data.fs 文件理,这个文件位于 var 目录 (具体定位可以搜索 Data.fs文件). 这个数据库也通常作为zope的对象数据库 (ZODB)。

http://315ok.org/boke/howtobeifenheyizhiplone

7 ZODB对象数据库

ZODB 入门 http://www.ibm.com/developerworks/cn/aix/library/au-zodb/

Zope的数据存储方式 http://blog.czug.org/panjy/zope-storage

ZODB笔记 http://wiki.woodpecker.org.cn/moin/ZODB%E7%AC%94%E8%AE%B0

中文版Zope外部编辑器客户端

http://zopen.cn/products/open/ExternalEditor-zh

http://www.zope.org/Members/Caseman/ExternalEditor

Zope支持使用多种方式来数据,而不仅仅使用一个单独的Data.fs文件

安装Zope后,会发现数据均保存在一个Data.fs的文件中,而且采用的是一个不开放的存储格式。很多人会产生疑问:

  • 一旦数据量增加了,这个独立Data.fs能否承受?系统性能是否会变慢?
  • 我保存了大量的图片、文档,能否让这些数据保存在文件系统中?
  • 关系数据库已经非常成熟了,能否保存在关系数据库中?

其实,独立Data.fs仅仅是Zope一个缺省存储方式,能够满足大多数的应用。通过定制和选择其他的第三方插件,可以满足其他的特殊要求。

  • ZODB支持多个storage。这样您可以把您的Data.fs文件分割为多个文件,分别存储数据。在$ ZOPEINSTANCE/etc/zope.conf中,可以设置具体的ZODB存储方案。同时在ZMI中,需要mount相应的storage。使用 起来就好像在linuxmount一个分区一样。
  • ZODBstorage有很多种,Data.fs仅仅是一个FileStorage,即单文件的storage方式。其他的storage包括DirectoryStorage(分目录存储数据), APE(可适配的存储引擎,见后)BDBStorage(将数据保存在BerkerleyDB中),以及OracelStorage等。各个storage有不同的特点,可参考这个 对比
  • APE是一个可适配的存储引擎,通过适配器,她能够把python对象保存在一个文件系统中、或者关系数据库中、或者其他任意的地方。目前主要用于ZODB,也可以用 zope/zodb外的其他Python项目。APE目前支持文件系统和数据库的两种适配。可提供到postgresql/mysql的映射,同时CA 公司也提供了到Ingres数据库的映射适配器。APE得到了CA公司的支持。
  • 上面是一些ZODB相关的storage。实际上通过zope也可以直接访问关系数据库,直接将数据存储在关系数据库而不是存储在ZODB上。
  • 如果开发新的产品,可使用ArchetypesArchetypes提供的抛开ZODB外的独立的Storage,可将数据保存到文件系统或者数据库(还不成熟)中。
  • zope3上,数据存储的适配功能更强。目前有一个sqlos产品,利用了sqlobject (wiki)"对象-关系数据库"映射机制,将数据保存到关系数据库上。python上的对象和关系数据库映射系统其实很多,除了sqlobject, 前面的ape上就有一个,其他的还有Modeling PyDO

因此,Zope的存储是十分灵活的,他提供了十分全面的存储机制,几乎可以满足您任意的存储要求。

 

 

8 附录:

8.1 Zope/Plone内容管理系统的探讨与应用

[摘要] 随着企业经营模式的变化和技术的不断发展,从内容管理诞生到今天,关键技术的研究侧重于支撑内容管理平台的核心技术研究,主要包括XML和元数据技术、工 作流管理技术、应用集成技术以及数据检索和挖掘技术。Zope/Plone内容管理系统作为开源项目,正适应内容管理关键技术的发展要求,可以为企业或部 门建立一个稳定、高效、安全的内容管理系统。科技信息作为一种重要的信息资源,完全可以利用内容管理系统来进行管理。本文主要探讨了内容管理的基本概念及 Zope/Plone内容管理系统的特点,如何在实践中搭建科技信息网。本文尝试利用Zope/Plone搭建了集团公司科技信息网,目的是为用户提供科 技信息、学术交流、期刊报纸、科技文摘、电子图书、图片资料、文件下载、全文检索等服务。
关键词:内容管理  CMS  Zope  Plone  Web技术  科技信息

1  前言
联网的发展和应用是内容管理市场的强烈推动力。8年前,内容管理(Content Management)的观念开始萌芽。如今,电子商务又变得非常流行,很多企业已看到电子商务的重要作用,开始大力发展电子商务,如OA系统、协作工作 平台、协同商务。企业的信息化程度不断加强,越来越多的信息将以数字化的形态呈现在信息处理、交互、传播的过程中。越来越多的媒体和企业已经重新审视自己 所掌握的内容(信息资源),并视手中的信息资源为资产。
科技信息作为一种重要的信息资源,完全可以利用内容管理系统来进行管理。本文主要探讨内容 管理的基本概念,Zope/Plone内容管理系统的特点,如何在实践中搭建科技信息网。阐述了利用Zope/Plone搭建了集团公司科技信息网,为本 公司级用户提供科技信息、学术交流、期刊报纸、科技文摘、电子图书、图片资料、文件下载、全文检索等服务。系统应用环境:操作系统Windows 2000Web应用服务器Zope 2.7.0,开发语言Python 2.3.3,内容管理系统Plone 2.0.3(包括内容管理框架CMF 1.4.4)。
2  内容管理系统(CMS)的概述
2.1  Web应用中内容管理的引入
Web应用的简要发展历程分为三个阶段:第一阶段,简单的信息发布,品牌推广等;第二阶段,门户功能、销售线索搜集、客户服务、客户关系等自助服务;第三阶段,电子商务(eBusiness)等。
着信息量不断增多与Web技术的成熟与发展,客户端技术从静态向动态的演进,Web服务端的开发技术也由静态向动态逐渐发展。Web服务端开发技术的完善 也使开发复杂的Web应用成为可能,Web应用也日益复杂,Web的更新方式也有了较大的变更,其变化主要有三个阶段:第一阶段:静态更新 Static),主要特点有手工编写HTML或借用网页制作工具、通过FTP上传到服务器上、更新缓慢、容易出现链接错误、对服务器无特别要求等;第二 阶段:实时更新(RealTime),主要特点有制作模板、使用动态主页技术输出HTMLCGIPerlASPPHPJSP Serverlet)、更新速度非常快、需要服务器上有数据库支持、对服务器资源占用很严重、现在的大多数中小网站广泛采用等;第三阶段:及时更新 Just In Time),主要特点有引入了内容管理系统、自动的内容复制功能、更新及时、不依赖于服务器平台、可有工作流支持、可进行版本控制、易扩展等。
2.2  内容管理系统
Web 应用需要一个完整的开发框架或应用模型,有几种主要技术的融合方式,首先,越来越多的Web开发环境开始支持MVCModel-View- Controller),提供了全套的开发环境;其次,门户服务(Portal Server)和内容管理系统(Content Management System)成为了应用集成的重点模型。
2.2.1  什么是内容管理
内容实质上就是任何类型的数字信息的结合体,可以是文本、图形图 象、Web页面、业务文档、数据库表单、视频、声音文件等。应该说,内容是一个比数据、文档和信息更广的概念,是对各种结构化数据、非结构化文档、信息的 聚合。管理就是施加在"内容"对象上的一系列处理过程,包括收集、确认、批准、整理、定位、转换、分发、更新、存档等,目的是为了使"内容"能够在正确的 时间、以正确的形式传递到正确的地点和人。
内容管理是目前业内的一项热门技术和应用。对于这项新兴的技术,业内尚未有一个统一的定义,是协助组织 和个人,借助信息技术,实现内容的创建、储存、分享、应用、更新,并在企业个人、组织、业务、战略等诸个方面产生价值的过程,而内容管理系统就是能够支撑 内容管理的一种工具或一套工具的组合。
2.2.2  内容管理系统的功能
如图1所示,一个完整的内容管理系统应具有四大功能:内容集成、内容智能、内容管理和内容发布。

1 内容管理系统的功能结构
1)内容集成:让使用者到不同系统中寻找到不同形式的资料文档,如文档、视频、声频、图形文件等。
2)内容智能:是内容管理系统的核心功能模块,将内容分类归档,用以帮助使用者快速定位所需内容,按照搜索方法可分为全文搜索、上下文搜索等。现在更先进的检索技术还包括智能化知识检索技术,自然语言查询等。
3)内容管理:是内容管理系统的主要功能模块,用以提供对内容管理过程的支持,包括:
l 内容创建和编辑,用以实现各种数据、信息、文档和程序的获取并提供创建内容的协作工具,如文档和网页制作工具,数据转换(Metadata and XML)工具等。
l 内容个性化,内容的个性化是内容管理区别于传统文档管理的一个重要特征,包括根据用户喜好的用户控制个性化、根据内容相关性的数据控制个性化等。
l 存档管理,用以实现安全存贮、管理各种形式的内容。
l 工作流,用以实现用户自定义的流程和基于角色的流程控制、审批流程等。
l 安全控制,包括数据库安全控制、加密,拷贝和传播限制等。
l 生命周期管理,主要是指对内容版本的控制,如多版本控制、版本跟踪等功能。
4)内容发布:让所有的使用者在同一个时间接收到信息,包括传统的非Web方式的图形用户界面GUI以及新近发展起来的企业信息门户等各种方式。
2.2.3  内容管理系统的分类
容管理系统主要有框架型和应用型。框架型:本身不包含任何应用实现,只提供底层框架,具体应用需要一定的二次开发,如商业软件中有BEA WebLogic PortalOracle Portal Developer KitIBMWebSphere PortalMicrosoft Content Management Server等,开源项目中有CocoonZope等。应用型:本身是一个面向具体类型的应用实现,包含新闻/评论管理、图片、文件下载、投票、论坛、 成员管理、Wiki等一些子系统。如开源项目中有PHP-NukeXOOPSPloneWiki(维基)、phpBB等。
3  Zope/Plone内容管理系统
内容管理系统作为当前一种流行的Web应用模型, Zope/Plone内容管理系统是开源项目(Open Source SoftwareOSS),为我们提供了一个很好的解决方案。
3.1  Zope应用服务器
ZopeZ Object Publishing EnvironmentZ对象发布环境)是下一代开放源码应用服务器以及门户工具,由Digital Creations开发,已经拥有一群相当活跃的用户社群。它既可以在所有Unix/Linux平台上运行,也能在WindowsMac OS上运行,不但能集成到其他流行的Web服务器,也带有自己的Web服务器,Zope 2.7可到http://www.zope.org下载,安装可参考有关手册。提供了清晰的数据/逻辑/表示的分离,带有可扩展的内置对象和强大的集成安 全模块。还有大量的第三方产品支持。Zope采用Python语言编写,在性能敏感的部件上采用了C语言编写。
3.1.1  Zope的简要特点
其它Web应用服务器相比,Zope可以更好更快的创建Web应用程序,主要特点有:免费、一套完整的平台、第三方产品的支持、易扩展、可在大多数操作系 统上运行、高效的协同开发、提供多种和可扩展的安全框架、只使用浏览器就可以创建Web应用程序(IEMozillaNetscape)等。
Zope提供了所有必须的工具,能集成来自任何数据源的所有数据和内容,构成一个连续、可维护的Web应用,如Web服务器、Web方式的管理界面(ZMI)、对象数据库(ZODB)、内容管理、内置搜索工具、强大的数据共享、安全授权、版本管理、XML的支持等。
Zope 2.7应用服务器的管理界面(ZMI)如图2所示。

2 Zope 2.7应用服务器的管理界面(ZMI
3.1.2  Zope体系结构
Zope体系结构如图3
ZServer,这是Zope内置的Web服务器,用于提供内容服务。这个web服务器还通过FTP WebDAVXML-RPC协议提供服务。
Web ServerWeb服务器),Zope还可以和现有的Web Server结合在一起,比如Apache或者Microsoft IIS,以及其它支持通用网关接口(CGI)的Web服务器。
Zope CoreZope核心),这是Zope的核心引擎,它控制如何显示,以及控制管理界面和对象数据库。
Object Database(对象数据库),使用Zope的时候,大多数情况下是在处理存储在Zope对象数据库中的对象。
Relational Database(关系型数据库),数据不一定要存储在Zope对象数据库中,Zope中可以使用其它的关系型数据库,比如 Oracle, PostgreSQL, Sybase, MySQL等等。
File System(文件系统),Zope还可以使用存储在服务器文件系统中的文档和其它文件。
ZClasses,可以通过使用Web管理界面来添加新的对象。
Products(产品),Zope中还可以通过在Zope服务器中的文件系统里安装"产品"文件来添加新的对象。

3 Zope体系结构
3.2  Plone内容管理系统
Plone 是基于Zope系统的优秀开源项目,包括CMF,特点是易用、功能强大,可管理发布HTMLWordPDF等各种类型文档,支持工作流 (Workflow)、用户管理、新闻/事件按排、全文搜索等功能,适合用作搭建对外网站、内部网系统、文档发布、协同群件系统等。Plone 2.0.3可到http://www.plone.org下载,安装可参考有关手册。
3.2.1  系统特点
l 易用:Plone的开发团队中包括专职的可用性设计专家, 他们使得Plone的添加、修改和维护等操作更加易用,支持结构化文本。
l 多语言:Plone界面支持30多种语言,系统本身也包括管理多种语言的工具。
l 标准:Plone遵循相关可用性标准和可访问性标准开发,支持IEMozillaOpera等浏览器,以及PDA等手持设备上的浏览器;支持HTTPHTTPSFTPWebDAVXML-RPC等多种标准协议。
l 开放源代码:Plone使用和Linux相同的许可协议(GPL)。用户可以直接使用Plone,而不需要支付任何许可费用, 并可在其上进行定制扩展。
l 可扩展:有丰富的第三方产品可供选择,如讨论区、图片库、投票等,可以很容易扩展Plone系统,增加新的特性和内容类型。Plone本身也是一个开发平台,可使用PythonZPTDTML脚本语言进行更多地定制开发。
l 跨平台、支持多种数据库。
操作系统:LinuxWindowsMac OS X, Solaris FreeBSD
数据库:可同绝大多数的关系数据库系统(开源的和封闭源代码的)进行接口。
3.2.2  主要功能及第三方应用型产品
Zope是一个高可扩展的系统,Plone作为Zope的第三方产品,继承了这个特点,可以在Plone的基础上扩展各种应用,可以很轻松地安装和卸载,并可以进行个性化定制。
Plone 系统本身所具有的主要功能:页面文档管理(Document),其他形式的内容管理-有图片(Image)、文件(File)、链接(Link)、查询集 Topic)、文件夹(Folder)、新闻(News)等,查询检索(Search),权限管理,工作流系统(Workflow System),成员管理(Members),还有评注文档、站点参数配置、第三方产品的安装、定制站点界面等。
其他第三方产品(可在http://www.zope.org下载):
l 论坛--CMFBoardCMFForum,可以设置一个或更多的子论坛;每个子论坛可以设置不同的状态。
l 图片--CMFPhotoAlbumCMFPhoto,建立一个图片集文件夹,可以轻松自如地管理图片,可以添加图片,编辑其属性(主题、描述、上传图片);还可以对图片进行变换(旋转、翻转);浏览图片时可以分页显示。
l ZWiki--ZWiki是在Zope平台上提供的Wiki服务。它在功能上比传统的Wiki有所区别,主要有:Wiki名字的更灵活;可选的标记格式, 如:结构化文本、HTML/DTMLWiki标记语言、无格式文本等;页面的层次化,即可以显示出页面创建的级别,可以直接看到包含当前页面的父文档链 接。
l 文件--由于Zope除了对数据库的支持,Zope还支持文件系统。可以把指定的当地文件系统的文件信息加载到站点中的一个文件夹,也支持HTTP上传文件,并对文件添加注释,可创建子目录。
l 调查--PlonePopoll,可以自由地建立各类调查,只要编辑其调查的问题及选择的项目,就可以生成一个调查,每位用户都可以对调查投出唯一的一票;并且可以对调查结果作简要的图形分析,显示投票总数及每个项目的票数。
3.2.3  Plone完全支持中文
Plone 支持中文的目标是:(1)界面支持中文;(2)支持中文查询;(3)其他应用程序也支持中文。Plone 2.0.3已默认支持中文(由润普科技ZopeChina提供),标准的Plone安装后,自动支持中文的界面,但是不支持中文的全文检索,结构化文本也 不太支持中文。根据润普科技ZopeChina提供的方案,需要下载CJKSplitterZopeChinaPak的最新版本安装,建立Plone 点时选择"Default Chinese Plone"的个性化Plone设置,界面即可支持中文。最大特点是支持任意的语言:中文简体、繁体、日本、韩文、欧洲。通过设置,可以让Plone支持 中文全文搜索;其他应用程序只要有汉化包也就可以支持中文,即*-zh-cn.po*-zh.po,也可使用第三方产品Localizer进行本地化。
4  利用Zope/Plone内容管理系统整合科技信息
4.1  科技信息网项目背景
技信息作为企业一种技术资源,根据企业的发展状况,科技管理主要产生的信息有:科研课题、学术论文、图片资料、期刊图书等,包括文字、图片、图表及视频, 信息资源丰富、内容容量大、借阅访问者多。如何把科技信息通过网络的形式建设成为公司的知识资源开发利用中心,实现上述信息资源的集成与共享,加快公司在 科研、生产和经营方面获取信息的速度。
科技信息网的规划建设,涵盖了从内容采集、存储管理、编辑审核一直到传递服务的全部内容管理生命周期的管理。整合公司的科技信息资源,提高信息的利用率,最大限度地共享科技信息。
4.2  基于内容管理技术的系统设计
立科技信息网的目的是为了实现将来自科技管理处各职能室的科技信息(含文字、图片、图表)全部整合,并通过这一系统公司各部门对科技信息的共享。将总体需 求划分为核心应用需求(信息采集、信息分类、信息编辑、信息发布、信息检索、安全管理等)和辅助应用需求(用户管理、日志管理、访问统计、站点调查、信息 提示功能、支持多语言、数据的维护、站点的个性化设置、在线统计、日历等)。
4.2.1  整体功能框架
科技信息内容管理系统的整体功能框架如图4

4 科技信息内容管理系统的整体功能框架
4.2.2  硬件系统结构
Zope架构进行多层体系结构设计,在公司的局域网中可以实现多用户、多操作系统的应用,可以在不同的时间、办公地点进行内容的管理,更有效地整合科技 信息,实时地为用户提供科技信息;系统可以轻松地对对象内容的扩展,增加各种形式的内容。用户只要通过局域网用浏览器就可以浏览信息,硬件系统结构如图 5

5  硬件系统结构图
4.3  Zope/Plone内容管理系统的配置与应用
前文提到Zope/Plone 容管理系统的众多特点及功能,并且使用Zope/Plone来搭建科技信息网,考虑到信息的多来源、多形式,有图书文献采集的科技文摘、科技活动中产生的 科技信息、科技图书馆的报刊杂志、学术交流活动产生的论文资料(包括Word)、公司各项活动中荣获的奖励证书图片及科技图片、图书馆的电子图书 PDFCEBWordHtml)、常用文件下载(应用程序、Word资料、各类表格)等。
4.3.1  Plone第三产品的安装及应用
Zope系统中建立一个Plone站点,根据Plone的基本特性和科技信息网的需求,需要充分了解Plone现有的一些第三方产品,建立一套第三方产品 的使用方案。Plone默认普通文档主要有页面文档(Document)、事件(Events)、新闻(News),这些文档都不能很好地与图片、附件等 其他资料混合在一起,很难适应我们具有文本、图片、附件为一体的信息。同时Plone没有完整的图片发布与管理产品,当然也没有调查、统计等第三方产品。 可以安装第三方产品,如:PloneArticlePlone文档)、CMFPhotoCMFPhotoAlbum(图片资料)、ZWiki ZAAPluginsZattachmentAttribute(附件)、PloneExFilePloneLoginHistory(登录历史)、 PlonePopoll(调查)、WhoOnline(在线统计)、MxmCounter(访问统计)等。
4.3.2  安全及权限设置
有了完备的第三方产品后,整个系统的功能基本实现,为了能符合硬件系统机构的要求,每位员工能协同工作,Plone为用户提供了文件夹的角色分配。内容的所有者可以为其他用户分配角色,即可使多用户对内容进行管理。
4.3.3  系统的应用
通过对Zope/Plone内容管理系统的合理配置,搭建了一个稳定、高效、安全的科技信息网,如图6

6 科技信息网
5  结束语
着企业经营模式的变化和技术的不断发展,从内容管理诞生到今天,关键技术的研究侧重于支撑内容管理平台的核心技术研究,主要包括XML和元数据技术、工作 流管理技术、应用集成技术以及数据检索和挖掘技术。Zope/Plone内容管理系统作为开源项目,正适应内容管理关键技术的发展要求,笔者尝试为企业或 部门建立一个稳定、高效、安全的内容管理系统--科技信息网。通过基于内容管理技术的科技信息网可以有效管理企业的现有智力资产,保持企业的核心竞争力; 建立学习平台,不断提供员工的素质,提升企业的素质;减少重复劳动,工作都可以在此前积累的基础上继续进行,避免员工或组织内的重复劳动;建立协同工作平 台,提高工作效率。

参考文献
[1] (美)H.M.Deitel,P.J.Deitel,J.P.Liperi,B.A.Wiedermann著,周靖译,《Python编程金典》,清华大学出版社,20036
[2] (美)Roger S.Pressman著,梅宏译,《软件工程-实践者的研究方法》第五版,机械工业出版社,20033
[3] 王咏刚,《Web开发技术史话》,《程序员》2004年第五期
[4] 新华社待编稿库项目组,《运用内容管理,整合信息资源》,《中国传媒科技》2004年第五期
[5] 韩啸、曹辉,《内容管理的关键技术》,《中国传媒科技》2004年第五期
[6] http://www.cmswire.com
[7] http://www.zope.orgZope官方网站),The Zope Book (2.6Edition)
[8] http://www.ZopeChina.comZope中国网站)
[9] http://www.plone.orgPlone官方网站),The Plone Book (2.0 Edition)

8.2 Zope/Plone内容管理系统的探讨与应用

比较对象:
1. drupal 6.1
2. joomla!1.51
3. Mambo 4.6.1
4. PHP Nuke 6
5. Plone 3.0
6. Xoops 2.0.18

http://www.ncnynl.com/xoops2016u/modules/article/view.article.php/c2/98/p0

结论

优势:

    1)基本上不用二次开发,直接就能用,这点不错。不像基于JAVA的一些开源CMSOpenCms之流背着CMS的名字实际上要开发的东西挺多的。

劣势:

1)数据库采用ZODB数据库,它与关系型数据库如何交换数据需要花精力进一步研究。

2)虽有汉化包,但打上了润普公司的图标,碍眼,不爽。

3)国内支持plone的域名比较少见,要想玩,我还得自己在家建个服务器,机器24小时开着太吵睡不着觉不现实。

4) 是基于python的,虽然看了一下也不算难,但毕竟不是平时工作用的语言,不用它过两天就忘记了,所以得持续投入精力,真正要用它这点得考虑。