为主要用于Zope的Web应用程序创建开发沙盒的工具和脚本
项目描述
快速入门
您可以使用仅两个命令从头开始创建基于Zope的Web应用程序
$ easy_install zopeproject $ zopeproject HelloWorld
第二个命令将询问您初始管理员的名称和密码。它还将询问将下载的Python包(“egg”)放在哪里。这样,使用 zopeproject 创建的多个项目可以共享相同的包,无需每次都下载它们(有关详细信息,请参阅下面的 沙盒间共享egg)。
(注:根据用户安装Python的方式,Unix/Linux用户可能需要使用sudo来运行easy_install。如果不希望这样做或无法这样做,可以在virtual-python或workingenv中用普通权限运行easy_install).
在提出这些问题后,zopeproject将下载用于构建沙盒的zc.buildout包,除非它已经在本地安装。然后,它将调用buildout来下载Zope及其依赖项。如果您是第一次这样做或不同项目之间不共享包,这可能需要一些时间。
当zopeproject完成后,您将在HelloWorld目录中找到一个典型的Python包开发环境:包本身(helloworld)和一个setup.py脚本。还有一个包含脚本(如可以用来启动应用程序的paster)的bin目录。
$ cd HelloWorld $ bin/paster serve deploy.ini
您还可以使用类似于Zope实例中zopectl脚本的helloworld-ctl脚本。
$ bin/helloworld-ctl foreground
启动应用程序后,现在您应该能够访问http://localhost:8080并看到Zope的默认启动屏幕。您还可以使用您之前指定的管理员用户帐户登录。
Windows用户注意事项
Zope所需的某些包包含C扩展模块。这些包可能不总是有可用的二进制Windows发行版。在这种情况下,setuptools将尝试从源代码编译它们,如果没有安装像Microsoft Visual C编译器这样的编译器,这很可能会失败。作为替代方案,您可以安装免费的MinGW编译器。
从http://www.mingw.org/下载MinGW-x.y.z.exe并运行它,将其完整安装到标准位置(即C:\MinGW)。
通过创建包含以下内容的C:\Documents and Settings\YOUR USER\pydistutils.cfg来告诉Python使用MinGW编译器
[build] compiler=mingw32
让Python了解MinGW的安装和pydistutils.cfg文件。为此,转到控制面板,系统部分,高级选项卡,并单击环境变量按钮。将C:\MinGW\bin目录添加到您的Path环境变量(各个路径由分号分隔)。还要添加另一个名为HOME的环境变量,其值为以下内容
C:\Documents and Settings\YOUR USER
在安装源代码包时,Python现在应自动使用MinGW编译器来构建二进制文件。
zopeproject的命令行选项
- --no-buildout
使用此选项时,zopeproject将只创建包含标准文件的项目目录,但不会下载和调用zc.buildout。
- --newer
此选项启用buildout.cfg中的newest = true设置。这样,buildout将始终检查在线eggs的新版本。例如,如果您在共享eggs目录中有过时的依赖版本,此开关将强制下载新版本。请注意,您始终可以编辑buildout.cfg以在现有项目区域中更改此行为,或者您可以使用带有-n选项的bin/buildout调用。
- --svn-repository=REPOS
此选项将项目目录及其中的文件导入给定的子版本控制系统(Subversion)仓库,并为您提供trunk的检出。 REPOS应该是将要创建的仓库路径,包括该路径下的tags、branches和trunk。此检入忽略由zc.buildout创建的任何文件和目录。
- -v,--verbose
启用此选项时,zopeproject不会隐藏easy_install(用于安装zc.buildout)和buildout命令的输出。
沙盒
不同的文件和目录分别是什么?
- deploy.ini
PasteDeploy的配置文件。它定义了要启动哪个服务器软件以及在每次请求时调用哪个WSGI应用程序(在src/helloworld/startup.py中定义)。您还可以在此处定义WSGI中间件。使用此文件作为参数调用bin/paster serve。
- debug.ini
PasteDeploy的替代配置,用于配置拦截异常以进行交互式调试的中间件。请参阅下面的调试异常。
- zope.conf
该文件将由src/helloworld/startup.py中的应用程序工厂读取。在此处,您可以定义应用程序工厂在启动时应加载哪个ZCML文件,ZODB数据库实例,事件日志以及是否启用开发者模式。
- site.zcml
此文件由zope.conf引用并由应用程序工厂加载。它是根ZCML文件,包含所有需要加载的内容。“所有其他内容”通常是应用程序包本身,helloworld,然后继续包含其依赖项。除此之外,site.zcml还定义了匿名主体和初始管理员主体。
- setup.py
此文件定义了您应用程序的egg。该定义包括列出包的依赖项(主要是Zope eggs)和PasteDeploy应用程序工厂的入口点。
- buildout.cfg
本文件告知 zc.buildout 在执行构建时应该做什么。这主要涉及执行 setup.py 以启用 HelloWorld egg(这还包括下载其依赖项),以及安装服务器所需的 PasteDeploy。此文件还引用了共享的 eggs 目录(eggs-directory)并确定构建是否应检查是否在线有更新的 eggs(newest)。
- bin/
此目录包含所有可执行脚本,例如启动应用程序(paster)、安装或重新安装依赖项(buildout)或调用调试提示(helloworld-debug)。它还包含一个脚本(python),该脚本使用模块搜索路径上的所有包调用标准解释器提示。
- src/
此目录包含您的应用程序的 Python 包。通常只有一个包(helloworld),但如果愿意,可以添加更多到该目录。zc.buildout 将将 src 目录放置在解释器的搜索路径上。
- var/
ZODB 文件存储将在此放置其文件(Data.fs、锁文件等)。
重命名
您可以在任何时候重命名或移动沙盒目录。只需确保在这样做后再次运行 bin/buildout。重命名沙盒目录不会更改 egg 的名称。要更改名称,您必须更改 setup.py 中的 name 参数。
开发
使用您的应用程序的第一步
第一次启动 Zope 后,您可能想开始开发您的网络应用程序。您的应用程序代码将放入由 zopeproject 在 src 目录中创建的 helloworld 包中。
例如,要显示简单的“Hello world!”消息,创建 src/helloworld/browser.py 并包含以下内容
from zope.publisher.browser import BrowserPage class HelloPage(BrowserPage): def __call__(self): return "<html><body><h1>Hello World!</h1></body></html>"
然后,您只需要在 ZCML 中连接页面。为此,在 src/helloworld/configure.zcml 文件的末尾添加以下指令
<browser:page for="*" name="hello" class=".browser.HelloPage" permission="zope.Public" />
请注意,您可能需要在文件顶部定义 browser 命名空间前缀
<configure xmlns="http://namespaces.zope.org/zope" xmlns:browser="http://namespaces.zope.org/browser" >
使用 paster serve 重新启动应用程序后,您可以通过访问 http://localhost:8080/hello 来查看页面。
向应用程序添加依赖项
标准 setup.py 和 configure.zcml 文件列出一组对于大多数 Zope 应用程序典型的标准依赖项。您当然可以从此列表中删除某些内容,但通常您会想重用更多其他开发者编写的库。许多(如果不是大多数)额外的 Zope 和第三方库都列在 Python Cheeseshop 上。
假设你希望在应用程序中重用< span class="docutils literal">some.library 包。第一步是将它添加到< span class="docutils literal">setup.py(< span class="docutils literal">install_requires)中的依赖列表中。如果这个包定义了任何Zope组件,你可能还需要通过在< span class="docutils literal">src/helloworld/configure.zcml中添加以下行来加载其ZCML配置
<include package="some.library" />
更改< span class="docutils literal">setup.py后,你可能希望新添加的依赖项被下载并添加到< span class="docutils literal">bin/paster的搜索路径中。为此,只需调用buildout即可
$ bin/buildout
编写和运行测试
应将自动测试放在Python模块中。如果所有测试都适合一个模块,则该模块应简单地命名为< span class="docutils literal">tests。如果你需要许多模块,创建一个< span class="docutils literal">tests包并将模块放在其中。每个模块都应该以< span class="docutils literal">test开头(例如,测试模块的完整点名称可以是< span class="docutils literal">helloworld.tests.test_app)。
如果你更喜欢将功能测试与单元测试分开,可以将功能测试放在一个< span class="docutils literal">ftests模块或包中。请注意,这对测试运行器来说无关紧要,它根本不关心测试用例的位置。
每个测试模块都应该定义一个< span class="docutils literal">test_suite函数,该函数构建测试运行器的测试套件,例如。
def test_suite(): return unittest.TestSuite([ unittest.makeSuite(ClassicTestCase), DocTestSuite(), DocFileSuite('README.txt', package='helloworld'), ])
要运行应用程序包中的所有测试,只需调用< span class="docutils literal">bin/test脚本
$ bin/test
功能测试
虽然单元测试通常不需要或只需要很少的测试设置,但功能测试通常需要启动整个应用程序的配置来创建真实的测试环境。负责此测试环境的配置文件是< span class="docutils literal">ftesting.zcml。如果您有特定于功能测试的组件(例如,模拟组件),则可以向其中添加更多配置指令。
要使特定测试在测试环境中运行,只需将< span class="docutils literal">helloworld.testing.FunctionalLayer层应用于它
from helloworld.testing import FunctionalLayer suite.layer = FunctionalLayer
您还可以简单地使用< span class="docutils literal">helloworld.testing中的方便测试套件之一
< span class="docutils literal">FunctionalDocTestSuite(基于< span class="docutils literal">doctest.DocTestSuite)
< span class="docutils literal">FunctionalDocFileSuite(基于< span class="docutils literal">doctest.DocFileSuite)
< span class="docutils literal">FunctionalTestCase(基于< span class="docutils literal">unittest.TestCase)
调试
解释器提示
如果您想从解释器提示符测试某些组件,并且不需要组件注册或访问ZODB,请使用< span class="docutils literal">bin/python脚本。如果您需要这些,请继续下一节。
交互式调试提示
偶尔,能够交互式地调试应用程序的状态是有用的,例如在ZODB中遍历对象层次结构或手动查找组件。这可以通过交互式调试提示符来完成,该提示符在< span class="docutils literal">bin/helloworld-debug下可用
$ bin/helloworld-debug Welcome to the interactive debug prompt. The 'root' variable contains the ZODB root folder. The 'app' variable contains the Debugger, 'app.publish(path)' simulates a request. >>>
现在您可以获取根文件夹的文件夹列表,例如
>>> list(root.keys()) [u'folder', u'file']
调试异常
如果您的应用程序因异常而失败,则可以使用调试器检查环境。这可以通过< span class="docutils literal">z3c.evalexception WSGI中间件来完成。当应用程序中出现异常时,停止进程并重新启动它,现在使用< span class="docutils literal">debug.ini配置文件
$ bin/paster serve debug.ini
当您重复导致异常的步骤时,您将在浏览器中看到相关的跟踪回溯,并可以查看相应的源代码,以及发出Python命令以进行检查。
如果您更喜欢Python调试器< a href="https://docs.pythonlang.cn/lib/module-pdb.html" rel="nofollow">pdb,请将< span class="docutils literal">ajax在< span class="docutils literal">debug.ini中的WSGI中间件定义中替换为< span class="docutils literal">pdb
[filter-app:main] use = egg:z3c.evalexception#pdb next = zope
注意:即使是像未授权(通常会导致登录界面)或NotFound(通常会导致HTTP 404响应)这样的异常也会触发调试器。
部署
禁用调试工具
在部署基于zopeproject的应用程序之前,您应该确保任何调试工具都已禁用。特别是,这包括:
确保在 deploy.ini 中没有调试中间件(通常这些应该在 debug.ini 中配置),
在 zope.conf 中关闭 developer-mode,
在 site.zcml 中禁用APIDoc工具,
在 site.zcml 中禁用引导管理员主体。
Linux/Unix
您可以使用 helloworld-ctl 脚本以守护进程模式启动服务器进程。它的工作方式类似于从Apache HTTPD服务器或Linux中的INIT脚本所知的 apachectl 工具。
$ bin/helloworld-ctl start
要停止服务器,请执行:
$ bin/helloworld-ctl stop
还支持其他命令,如 status 和 restart。
Windows
目前除了paster提供的功能外,没有针对Windows部署的特殊支持。计划实现与Windows服务的集成,就像在Zope的老版本中找到的那样。
报告zopeproject的错误或提出相关问题
zopeproject在Launchpad上维护一个错误跟踪器和帮助台:[https://launchpad.net/zopeproject](https://launchpad.net/zopeproject)
问题也可以发送到zope3-users邮件列表:[http://mail.zope.org/mailman/listinfo/zope3-users](http://mail.zope.org/mailman/listinfo/zope3-users)
鸣谢
zopeproject由Philipp von Weitershausen编写和维护。它受到了来自同一作者相似的 grokproject 工具的启发。
James Gardner、Martijn Faassen、Jan-Wijbrand Kolman 等人对2007年EuroPython上展示的早期原型提供了宝贵的反馈。
Michael Bernstein提供了宝贵的反馈并提出了许多改进建议。
zopeproject在Zope公共许可证,v2.1下分发。版权(c)归Zope公司和贡献者所有。
变更
0.4.2 (2009-02-12)
在默认部署的buildout.cfg中使用Zope 3.4.0 KGS。
在zope.conf的默认ZODB配置中添加了blobstorage代理。
使用来自zope.securitypolicy的ZopeSecurityPolicy而不是zope.app.securitypolicy,后者是该功能已过时的位置。
zope.securitypolicy使用一个特殊的角色名称,即每个用户都有的 zope.Anonymous,在site.zcml中定义它并授予其查看权限,而不是zope.Anybody未认证的用户组。
0.4.1 (2007-09-29)
改进了 README.txt 和 var/README.txt(它指向了错误的配置文件)。将更改日志从 README.txt 移至单独的 CHANGES.txt 文件。
现在不再忽略 --no-buildout 选项。
添加了一个模仿解释器的 bin/python 脚本。
默认启用了APIDoc工具。您可以通过 http://localhost:8080/++apidoc++ 访问它。
简化了 *package*/testing.py。
0.4 (2007-09-15)
新功能
添加了一个类似于zopectl的 *package*-ctl 控制器脚本(其中 *package* 是使用zopeproject创建的包的名称)。
添加了一个名为 *package*-debug 的调试脚本,它配置应用程序并进入解释器会话。它也可以通过 *package*-ctl debug 访问。
添加了 debug.ini,该文件配置了用于拦截异常和实时调试的WSGI中间件(可以使用Paste的evalexception中间件或Python调试器pdb)。
在 *package*.testing 中添加了功能测试层,该层加载了新的 ftesting.zcml。在 *package*.testing 中还提供了为该层预配置的测试套件的便捷定义。
对 README.txt 文件进行了更多改进。
错误修复和重构
利用 zope.app.wsgi.getApplication() 减少了 startup.py(以前称为 application.py)中的启动样板。
zopeproject创建的包现在位于 src 目录中,这使得它在其他文件和目录中更容易被识别。
修复了在猜测默认eggs目录时的一个错误:当 ~/.buildout/default.cfg 不包含 eggs-directory 选项时,zopeproject会因 ConfigParser.NoOptionError 而失败。
将 application.py 重命名为 startup.py,使模块的意图更加清晰,并避免与例如Grok(其中“application”意味着其他东西,且通常使用 app.py 作为应用对象)发生冲突。
如果eggs目录与 ~/.buidout/default.cfg 中的构建out默认值相同,则不再将其写入 buildout.cfg。
清理并增强了生成的应用程序的依赖项。它不再依赖于 zope.app.securitypolicy,只有部署(site.zcml)才依赖。已删除过时的依赖(及其在 ZCML 中的包含语句)。添加了 zope.app.catalog 和其他作为便捷功能。
0.3.2 (2007-07-17)
如果用户已在 ~/.buildout/default.cfg 中设置了默认的eggs目录,则将其用作eggs目录的默认值。
极大地改进了 README.txt 文件。
0.3.1 (2007-07-15)
构建out.cfg模板缺少共享eggs目录和 newest 标志的设置。
以Windows友好的方式组装eggs目录的默认路径。
0.3 (2007-07-14)
更名为 zopeproject。
吸收了grokproject 0.5.x的大部分基础设施。这使得它更加稳健,尤其是在启动 zc.buildout 时。
将 make-zope-app 和 deploy-zope-app 合并回一个命令: zopeproject。
0.2 (2007-07-12)
更名为 make-zope-app。
将 mkzopeapp 分为两个命令: make-zope-app 和 deploy-zope-app。
不再使用 zope.paste 作为应用程序工厂。相反,从骨架创建的每个应用程序都定义了自己的工厂(该工厂相对较小且具有灵活性)。
删除了 start<<Project>> 脚本。只需使用 bin/paster serve deploy.ini 启动服务器。
默认使用 Paste#http 服务器。
0.1 (2007-07-06)
作为 mkzopeapp 的初始发布。
项目详情
zopeproject-0.4.2.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8cb9cb9e5eb90ed1ae16b3afb4cbb5827635d05dbabe4de51042b8f933c6a957 |
|
MD5 | eaaaf1b3772d938e7674f598fb53c1b0 |
|
BLAKE2b-256 | db484f1ec7701cf81c54d0e018e58c6f1d4e557fef111eddd53b917b095e9116 |