此方法有助于创建和管理多个zope 2文件存储。
collective.recipe.filestorage的Python项目详细描述
详细文档
简介
这个配方会在zope.conf中添加额外的文件存储和zodb_db节。 以及plone.recipe.zope2instance和 扑通一声。菜谱。[zope2]Zeoserver菜谱。它还创建目录 将创建额外的文件存储数据文件。这使得添加 Zope2实例的附加文件存储和装入点。
支持的选项
< DL>以下选项影响生成的zope.conf和zeo.conf。 为collective.recipe.filestorage中的所有文件存储子部分指定 构建部分,或为一个特定的文件存储子部分放置选项 在名为"文件存储"子部分的新构建部分中,其中子部分是名称 本配方"部分"选项中所列的子部分。的名称 子部分可通过在选项中使用"%(fs_part_name)s"进行插值。
< DL>示例用法
让我们创建并运行一个最小的构建,添加一个额外的文件存储:
>>> write('buildout.cfg', ... ''' ... [buildout] ... extends = base.cfg ... parts = ... filestorage ... instance ... ... [instance] ... recipe = plone.recipe.zope2instance ... zope2-location = %(zope2_location)s ... user = me ... ... [filestorage] ... recipe = collective.recipe.filestorage ... parts = ... my-fs ... ''' % globals()) >>> print system(join('bin', 'buildout') + ' -q')
我们的zope.conf应该自动将额外的文件存储节注入其中:
>>> instance = os.path.join(sample_buildout, 'parts', 'instance') >>> print open(os.path.join(instance, 'etc', 'zope.conf')).read() %define INSTANCEHOME...instance ... <BLANKLINE> <zodb_db my-fs> cache-size 5000 <filestorage > path .../var/filestorage/my-fs/my-fs.fs </filestorage> mount-point /my-fs </zodb_db> <BLANKLINE>
配方还将为新文件存储创建一个目录:
>>> 'my-fs' in os.listdir(os.path.join(sample_buildout, 'var', 'filestorage')) True
让我们确保在更改文件存储部分时会重新生成conf文件, 即使zope/zeo部件的直接配置没有改变:
>>> open('buildout.cfg', 'a').write(" my-fs-2\n") >>> print system(join('bin', 'buildout') + ' -q') >>> 'my-fs-2' in open('parts/instance/etc/zope.conf').read() True< >让我们确保即使删除了文件存储部分,也不会删除文件存储目录 从建筑物:
>>> write('buildout.cfg', ... ''' ... [buildout] ... extends = base.cfg ... parts = ... instance ... ... [instance] ... recipe = plone.recipe.zope2instance ... zope2-location = %(zope2_location)s ... user = me ... ''' % globals()) >>> print system(join('bin', 'buildout') + ' -q') >>> 'my-fs' in os.listdir(os.path.join(sample_buildout, 'var', 'filestorage')) True
我们可以覆盖许多设置的默认值:
>>> write('buildout.cfg', ... ''' ... [buildout] ... extends = base.cfg ... parts = ... filestorage ... instance ... ... [instance] ... recipe = plone.recipe.zope2instance ... zope2-location = %(zope2_location)s ... user = me ... ... [filestorage] ... recipe = collective.recipe.filestorage ... location = var/filestorage/%(fs_part_name)s/Data.fs ... blob-storage = var/blobstorage-%(fs_part_name)s ... zodb-name = %(fs_part_name)s_db ... zodb-cache-size = 1000 ... zodb-mountpoint = /%(fs_part_name)s_mountpoint ... zodb-container-class = Products.ATContentTypes.content.folder.ATFolder ... parts = ... my-fs ... '''.replace('%(zope2_location)s', zope2_location)) >>> print system(join('bin', 'buildout') + ' -q') >>> instance = os.path.join(sample_buildout, 'parts', 'instance') >>> print open(os.path.join(instance, 'etc', 'zope.conf')).read() %define INSTANCEHOME...instance ... <BLANKLINE> <zodb_db my-fs_db> cache-size 1000 <blobstorage > blob-dir .../var/blobstorage-my-fs <filestorage > path .../var/filestorage/my-fs/Data.fs </filestorage> </blobstorage> mount-point /my-fs_mountpoint container-class Products.ATContentTypes.content.folder.ATFolder </zodb_db> <BLANKLINE>
也可以仅为一个特定的文件存储修改设置,方法是使用 文件存储前缀,如下所示:
>>> write('buildout.cfg', ... ''' ... [buildout] ... extends = base.cfg ... parts = ... filestorage ... instance ... ... [instance] ... recipe = plone.recipe.zope2instance ... zope2-location = %(zope2_location)s ... user = me ... ... [filestorage] ... recipe = collective.recipe.filestorage ... parts = ... my-fs ... ... [filestorage_my-fs] ... zodb-cache-size = 1000 ... ''' % globals()) >>> print system(join('bin', 'buildout') + ' -q') >>> instance = os.path.join(sample_buildout, 'parts', 'instance') >>> print open(os.path.join(instance, 'etc', 'zope.conf')).read() %define INSTANCEHOME...instance ... <BLANKLINE> <zodb_db my-fs> cache-size 1000 <filestorage > path .../var/filestorage/my-fs/my-fs.fs </filestorage> mount-point /my-fs </zodb_db> <BLANKLINE>
默认情况下,配方会将额外的文件存储添加到构建中的每个plone.recipe.zope2instance部分, 但您可以告诉它只添加到某些部分:
>>> write('buildout.cfg', ... ''' ... [buildout] ... extends = base.cfg ... parts = ... filestorage ... instance1 ... instance2 ... ... [instance1] ... recipe = plone.recipe.zope2instance ... zope2-location = %(zope2_location)s ... user = me ... ... [instance2] ... recipe = plone.recipe.zope2instance ... zope2-location = %(zope2_location)s ... user = me ... ... [filestorage] ... recipe = collective.recipe.filestorage ... zopes = instance1 ... parts = ... my-fs ... ''' % globals()) >>> print system(join('bin', 'buildout') + ' -q') >>> 'my-fs' in open('parts/instance1/etc/zope.conf').read() True >>> 'my-fs' in open('parts/instance2/etc/zope.conf').read() False
使用zeo的示例
这是一个最小的构建,包括一个zeo服务器和两个zodb客户端:
>>> write('buildout.cfg', ... ''' ... [buildout] ... extends = base.cfg ... parts = ... filestorage ... zeoserver ... primary ... secondary ... ... [zeoserver] ... recipe = plone.recipe.zope2zeoserver ... zope2-location = %(zope2_location)s ... ... [primary] ... recipe = plone.recipe.zope2instance ... zope2-location = %(zope2_location)s ... user = me ... zeo-client = 1 ... ... [secondary] ... recipe = plone.recipe.zope2instance ... zope2-location = %(zope2_location)s ... user = me ... zeo-client = 1 ... ... [filestorage] ... recipe = collective.recipe.filestorage ... parts = ... my-fs ... ''' % globals()) >>> print system(join('bin', 'buildout') + ' -q')
这将导致对zeo.conf和zope.conf的适当添加:
>>> write('buildout.cfg', ... ''' ... [buildout] ... extends = base.cfg ... parts = ... filestorage ... instance ... ... [instance] ... recipe = plone.recipe.zope2instance ... zope2-location = %(zope2_location)s ... user = me ... ... [filestorage] ... recipe = collective.recipe.filestorage ... parts = ... my-fs ... ''' % globals()) >>> print system(join('bin', 'buildout') + ' -q')0
如上所述,我们可以覆盖许多默认参数:
>>> write('buildout.cfg', ... ''' ... [buildout] ... extends = base.cfg ... parts = ... filestorage ... instance ... ... [instance] ... recipe = plone.recipe.zope2instance ... zope2-location = %(zope2_location)s ... user = me ... ... [filestorage] ... recipe = collective.recipe.filestorage ... parts = ... my-fs ... ''' % globals()) >>> print system(join('bin', 'buildout') + ' -q')1
默认情况下,配方会将额外的文件存储添加到第一个 plone.recipe.zope2zeoserver部分在构建中,如果 使用此配方的部分不止一个。但是,您可以覆盖此 通过指定一个特定的zeo部分的行为。在本例中,文件存储 将仅使用该zeo添加到zopes,默认情况下:
>>> write('buildout.cfg', ... ''' ... [buildout] ... extends = base.cfg ... parts = ... filestorage ... instance ... ... [instance] ... recipe = plone.recipe.zope2instance ... zope2-location = %(zope2_location)s ... user = me ... ... [filestorage] ... recipe = collective.recipe.filestorage ... parts = ... my-fs ... ''' % globals()) >>> print system(join('bin', 'buildout') + ' -q')2
错误条件
重要提示:必须使用 collective.recipe.filestorage recipe用于实例和 要将文件存储添加到的ZeoServer。否则你会得到 错误:
>>> write('buildout.cfg', ... ''' ... [buildout] ... extends = base.cfg ... parts = ... filestorage ... instance ... ... [instance] ... recipe = plone.recipe.zope2instance ... zope2-location = %(zope2_location)s ... user = me ... ... [filestorage] ... recipe = collective.recipe.filestorage ... parts = ... my-fs ... ''' % globals()) >>> print system(join('bin', 'buildout') + ' -q')3
具有多个zeoserver部件的构建将导致 如果未明确指定要关联的zeo,则出错:
>>> write('buildout.cfg', ... ''' ... [buildout] ... extends = base.cfg ... parts = ... filestorage ... instance ... ... [instance] ... recipe = plone.recipe.zope2instance ... zope2-location = %(zope2_location)s ... user = me ... ... [filestorage] ... recipe = collective.recipe.filestorage ... parts = ... my-fs ... ''' % globals()) >>> print system(join('bin', 'buildout') + ' -q')4
指定不存在的zeo将导致错误:
>>> write('buildout.cfg', ... ''' ... [buildout] ... extends = base.cfg ... parts = ... filestorage ... instance ... ... [instance] ... recipe = plone.recipe.zope2instance ... zope2-location = %(zope2_location)s ... user = me ... ... [filestorage] ... recipe = collective.recipe.filestorage ... parts = ... my-fs ... ''' % globals()) >>> print system(join('bin', 'buildout') + ' -q')5
所以应该指定一个不存在的zope部分:
>>> write('buildout.cfg', ... ''' ... [buildout] ... extends = base.cfg ... parts = ... filestorage ... instance ... ... [instance] ... recipe = plone.recipe.zope2instance ... zope2-location = %(zope2_location)s ... user = me ... ... [filestorage] ... recipe = collective.recipe.filestorage ... parts = ... my-fs ... ''' % globals()) >>> print system(join('bin', 'buildout') + ' -q')6
如果zope/zeo部件是自动识别的,那么让我们确保 我们不会意外地"唤醒"那些原本不会 包含在构建中:
>>> write('buildout.cfg', ... ''' ... [buildout] ... extends = base.cfg ... parts = ... filestorage ... instance ... ... [instance] ... recipe = plone.recipe.zope2instance ... zope2-location = %(zope2_location)s ... user = me ... ... [filestorage] ... recipe = collective.recipe.filestorage ... parts = ... my-fs ... ''' % globals()) >>> print system(join('bin', 'buildout') + ' -q')7
确保使用"extends"在构建中正确找到实例部分 +=或-=选项:
>>> write('buildout.cfg', ... ''' ... [buildout] ... extends = base.cfg ... parts = ... filestorage ... instance ... ... [instance] ... recipe = plone.recipe.zope2instance ... zope2-location = %(zope2_location)s ... user = me ... ... [filestorage] ... recipe = collective.recipe.filestorage ... parts = ... my-fs ... ''' % globals()) >>> print system(join('bin', 'buildout') + ' -q')8
运行测试
collective.recipe.filestorage的subversion签出包括一个buildout 安装用于运行测试的脚本。
只需运行:
>>> write('buildout.cfg', ... ''' ... [buildout] ... extends = base.cfg ... parts = ... filestorage ... instance ... ... [instance] ... recipe = plone.recipe.zope2instance ... zope2-location = %(zope2_location)s ... user = me ... ... [filestorage] ... recipe = collective.recipe.filestorage ... parts = ... my-fs ... ''' % globals()) >>> print system(join('bin', 'buildout') + ' -q')9
已知问题:测试在一个单独的进程中运行,因此当前 无法在配方中设置PDB断点并在测试期间进行调试。 如果需要这样做,请设置另一个使用collective.recipe.filestorage的构建 作为一个发展的蛋。
报告错误或提出问题
Launchpad上有一个共享的BugTracker和帮助台: https://bugs.launchpad.net/collective.buildout/