Zope 3 手册/入门
Zope 社区一直建议使用自定义构建的 Python 进行开发和部署。Python 2.4 是 Zope 3 的推荐版本,尽管 Python 2.5 也能正常工作,但尚未正式支持。
要安装 Python,您需要在系统中安装 gcc、g++ 和其他开发工具。典型的 Python 安装可以这样完成:
$ wget -c https://www.pythonlang.cn/ftp/python/2.4.5/Python-2.4.5.tar.bz2
$ tar jxvf Python-2.4.5.tar.bz2
$ cd Python-2.4.5
$ ./configure --prefix=/home/guest/usr
$ make
$ make install
如上所示,您可以提供一个选项--prefix 将 Python 安装到特定位置。上面的步骤将 Python 安装到/home/guest/usr 目录中。
安装完成后,您可以像这样调用 Python 解释器(~ 是/home/guest 的别名):
$ ~/usr/bin/python2.4
>>> print "Hello, world!"
Hello, world!
如果您在使用向上箭头键时,Python 交互式提示符中没有出现旧语句,请尝试安装libreadline 开发库(提示:apt-cache search libreadline)。安装完该库后,您应该重新安装 Python。您还需要安装zlib(提示:apt-cache search zlib 压缩库)才能正确安装 Zope 3。
FIXME:使用几个屏幕截图编写有关在 MS Windows 中安装 Python 的内容。
我们将使用名为 Buildout 的构建工具来开发由多个部分组成的 Zope 3 应用程序。Buildout 将为您提供一个独立的工作环境来开发应用程序。Buildout 包,名为zc.buildout 可从 PyPI 下载。本节简要介绍了 Buildout 在开发应用程序中的使用方法。
Buildout 有一个boostrap.py 脚本,用于初始化一个基于 Buildout 的项目,用于开发或部署。它将在指定的目录中下载并安装zc.buildout、setuptools 和其他依赖模块。启动后,它将在您项目源代码顶层的bin 目录中创建一个buildout 可执行脚本。每个项目的默认配置是您项目源代码顶层的buildout.cfg 文件。每当您运行buildout 命令时,它都会查看默认配置文件,并根据它执行操作。通常,配置文件和启动脚本会与项目源代码本身捆绑在一起。除了与项目源代码一起提供的默认配置文件外,您还可以创建系统范围的默认配置文件,位于~/.buildout/default.cfg。
Buildout 创建者 Jim Fulton 建议使用自定义构建的干净 Python 安装,即您的site-packages 中不应该安装任何 Python 模块(理想情况下,一个全新的 Python 安装)。当您使用 Buildout 的boostrap.py 脚本启动项目时,它将在指定的目录中下载并安装所有必需的包。因此,对于一个理想的项目,您只需要一个自定义构建的干净 Python 以及带有适当的Buildout 配置和启动脚本以及源代码包的项目源代码。
如今,大多数 Python 包都以 egg 格式提供。Buildout 将下载并安装 egg 到目录中,并且可以从配置文件中更改位置。最好为 egg 目录指定一个系统范围的位置。此配置可以添加到您系统范围的配置文件中。Buildout 的默认配置文件是~/.buildout/default.cfg。我们将使用您主目录内的eggs 目录来保存所有下载的 egg,因此首先创建这些目录和文件:
$ cd $HOME
$ mkdir .buildout
$ mkdir eggs
$ touch .buildout/default.cfg
您可以在~/.buildout/default.cfg 文件中添加以下内容:
[buildout]
newest = false
eggs-directory = /home/baiju/eggs
find-links = http://download.zope.org/ppix
eggs-directory 是 Buildout 存储下载的 egg 的位置。最后一个选项find-links 指向 Python Package Index (PyPI) 的可靠镜像。上面给出的默认配置将对您系统中的所有 buildout 可用。
FIXME:在此添加 MS Windows 特有的任何要求。
为了演示概念、工具和技术,我们将开发一个名为Ticket Collector 的简单票据/问题跟踪应用程序。要开始工作,首先为项目创建一个目录。创建目录后,创建一个buildout.cfg 文件,如下所示。要启动此应用程序,请检出bootstrap.py 并在该目录中运行它。
$ mkdir ticketcollector
$ cd ticketcollector
$ echo "#Buildout configuration" > buildout.cfg
$ svn co svn://svn.zope.org/repos/main/zc.buildout/trunk/bootstrap
$ ~/usr/bin/python2.4 bootstrap/bootstrap.py
您会看到在bin 目录中创建了一个buildout 脚本。现在,您可以更改 Buildout 配置时运行此脚本。
您可以将bootstrap.py 保存到本地存储库中。如果您使用 svn 管理存储库,请创建指向上面给出的 svn URL 的 svn:external。 |
我们的应用程序本质上是一个 Python 包。首先,我们将创建一个src 目录来放置我们的包。在src 目录中,您可以创建ticketcollector Python 包。您可以像这样创建src 和ticketcollector 包:
$ mkdir src
$ mkdir src/ticketcollector
$ echo "#Python package" > src/ticketcollector/__init__.py
要开始构建我们的包,您必须创建一个setup.py 文件。setup.py 应该包含以下最少细节:
我们在此包含了安装所需的最小包:zope.app.zcmlfiles、zope.app.twisted、zope.app.securitypolicy 和setuptools。
from setuptools import setup, find_packages
setup(
name='ticketcollector',
version='0.1',
packages=find_packages('src'),
package_dir={'': 'src'},
install_requires=['setuptools',
'zope.app.zcmlfiles',
'zope.app.twisted',
'zope.app.securitypolicy',
],
include_package_data=True,
zip_safe=False,
)
修改buildout.cfg,如下所示:
[buildout]
develop = .
parts = py
[py]
recipe = zc.recipe.egg
eggs = ticketcollector
interpreter = python
现在运行bin 目录中的buildout 脚本。这将下载所有必需的 egg 并安装它们。因此,安装 Zope 无非是使用带有install_requires 安装所需包的setup.py 设置一个buildout。除非您指定了一个以某种方式使用ticketcollector 的parts 部分,否则 buildout 不会下载依赖包。
在本节中,我们将继续 Ticket Collector 应用程序的开发。在上一节中,当你运行 ./bin/buildout 命令时,运行我们的应用程序所需的所有 Zope 3 包都会下载到 ~/eggs 目录中。现在,要运行最基本的 Zope 3,我们需要创建一个 Zope Configuration Markup Language (ZCML) 文件,并使用适当的 Buildout 食谱扩展 buildout.cfg。我们将使用 zc.zope3recipes:app、zc.zope3recipes:instance 和 zc.recipe.filestorage 食谱来设置我们的应用程序。以下是我们修改后的 buildout.cfg(位于 ticketcollector 项目目录中)
[buildout]
develop = .
parts = ticketcollectorapp instance
[zope3]
location =
[ticketcollectorapp]
recipe = zc.zope3recipes:app
site.zcml =
<include package="ticketcollector" file="application.zcml" />
eggs = ticketcollector
[instance]
recipe = zc.zope3recipes:instance
application = ticketcollectorapp
zope.conf = ${database:zconfig}
[database]
recipe = zc.recipe.filestorage
然后,我们将在 src/ticketcollector 目录中创建 application.zcml,其中包含以下内容。现在将其视为模板代码,我们将在后面详细解释
<configure
xmlns="http://namespaces.zope.org/zope"
>
<include package="zope.app.securitypolicy" file="meta.zcml" />
<include package="zope.app.zcmlfiles" />
<include package="zope.app.authentication" />
<include package="zope.app.securitypolicy" />
<include package="zope.app.twisted" />
<securityPolicy
component="zope.app.securitypolicy.zopepolicy.ZopeSecurityPolicy" />
<role id="zope.Anonymous" title="Everybody"
description="All users have this role implicitly" />
<role id="zope.Manager" title="Site Manager" />
<role id="zope.Member" title="Site Member" />
<grant permission="zope.View"
role="zope.Anonymous" />
<grant permission="zope.app.dublincore.view"
role="zope.Anonymous" />
<grantAll role="zope.Manager" />
<unauthenticatedPrincipal
id="zope.anybody"
title="Unauthenticated User" />
<unauthenticatedGroup
id="zope.Anybody"
title="Unauthenticated Users" />
<authenticatedGroup
id="zope.Authenticated"
title="Authenticated Users" />
<everybodyGroup
id="zope.Everybody"
title="All Users" />
<principal
id="zope.manager"
title="Manager"
login="admin"
password_manager="Plain Text"
password="admin"
/>
<grant
role="zope.Manager"
principal="zope.manager" />
</configure>
运行应用程序
[edit | edit source]现在,你可以通过运行 ./bin/buildout 命令,然后运行 ./bin/instance 命令来运行应用程序。
$ ./bin/buildout
$ ./bin/instance fg
因此,要运行 Zope 3 应用程序,我们需要使用具有适当配置的 buildout 食谱。
使用 ZMI
[edit | edit source]运行你的实例后,如果你打开一个 Web 浏览器并访问 https://127.0.0.1:8080,你将看到 ZMI(Zope Management Interface)。
继续点击右上角的 登录 链接。输入用户名和密码 admin,它在 applications.zcml 中给出。现在点击右侧导航栏中的 [顶部]。尝试添加一些内容对象(Zope 3 中对在 ZMI 中可见的实例的称呼)。注意内容对象如何通过添加 文件夹(可以容纳其他内容对象的特殊内容对象)来组织成层级结构。
ZMI 本身没有什么特别之处,它只是 Zope 3 的默认皮肤。你可以根据自己的喜好对其进行修改,甚至完全替换它。
当你完成对 ZMI 的探索后,返回到输入 ./bin/instance fg 的窗口,并按 Ctrl-C 停止 Zope 3。
Hello world
[edit | edit source]现在,你可以在 src/ticketcollector 目录中开始你的开发工作。创建一个 browser.py 文件,内容如下
from zope.publisher.browser import BrowserView
class HelloView(BrowserView):
def __call__(self):
return """
<html>
<head>
<title>Hello World</title>
</head>
<body>
Hello World
</body>
</html>
"""
现在,在 application.zcml 的最后一行之前添加以下内容
<browser:page
for="*"
name="hello"
permission="zope.Public"
class="ticketcollector.browser.HelloView"
/>
如上所示,我们使用了 browser 命名空间中的 page 属性。因此,你需要在 ZCML 开始时包含该命名空间,如下所示
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser"
>
重启 Zope 后,打开 https://127.0.0.1:8080/hello,你会看到它显示了 Hello World!