zodb的校验和

plone.checksum的Python项目详细描述


plone.校验和

概述

zodb数据的校验和

一般

这个包定义了一个用于计算的checksummanager, 访问并将校验和写入对象的各个字段。让我们 创建原型 文档 内容对象:

< Buff行情>
>>> folder = self.folder
>>> folder.invokeFactory('Document', 'mydocument', title='My Document')
'mydocument'
>>> doc = folder.mydocument

我们现在可以为这样的对象请求checksummanager:

< Buff行情>
>>> from plone.checksum import IChecksumManager
>>> manager = IChecksumManager(doc)

管理器将字段名映射到 ichecksum 对象:

< Buff行情>
>>> sorted(manager.keys())
['allowDiscussion', 'contributors', 'creation_date', 'creators', 'description', 'effectiveDate', 'excludeFromNav', 'expirationDate', 'id', 'language', ..., 'text', 'title']

我们将对象标题的校验和保留为 以下测试:

< Buff行情>
>>> original = str(manager['title'])
>>> print original
f796979e29808c04f422574ac403baeb

我们可以使用 calculate 手动调用校验和计算 校验和对象的方法。存储和计算的校验和 在这一点上肯定应该是相同的:

< Buff行情>
>>> print manager['title'].calculate()
f796979e29808c04f422574ac403baeb

校验和被写入(并附加到具有字段的对象) 使用 update 方法:

< Buff行情>
>>> manager['title'].update('something else')
>>> print manager['title']
something else

让我们使用 更新校验和 校验和管理器上的方法:

< Buff行情>
>>> manager.update_checksums()
>>> print manager['title']
f796979e29808c04f422574ac403baeb

最后,我们将更改标题并验证校验和是否 变化:

< Buff行情>
>>> doc.setTitle('something else')
>>> print manager['title'].calculate()
6c7ba9c5a141421e1c03cb9807c97c74

但是,存储的校验和仍然是旧值。我们需要修复 这是通过再次触发修改后的事件实现的。这次,我们不会解雇 事件本身,我们将调用processform 美国:< /P> < Buff行情>

>>> print manager['title']
f796979e29808c04f422574ac403baeb
>>> doc.processForm()
>>> print manager['title']
6c7ba9c5a141421e1c03cb9807c97c74

顺便说一下,这等于:

< Buff行情>
>>> folder = self.folder
>>> folder.invokeFactory('Document', 'mydocument', title='My Document')
'mydocument'
>>> doc = folder.mydocument
0

文件

让我们创建一个文件内容对象:之后,我们查看 文件的校验和 字段:

< Buff行情>
>>> folder = self.folder
>>> folder.invokeFactory('Document', 'mydocument', title='My Document')
'mydocument'
>>> doc = folder.mydocument
1

让我们在内容的 文件 字段中填充一些内容:

< Buff行情>
>>> folder = self.folder
>>> folder.invokeFactory('Document', 'mydocument', title='My Document')
'mydocument'
>>> doc = folder.mydocument
2

如果将文件内容设置为其他内容,则校验和将更改:

< Buff行情>
>>> folder = self.folder
>>> folder.invokeFactory('Document', 'mydocument', title='My Document')
'mydocument'
>>> doc = folder.mydocument
3

同样的方法也适用于较大的文件。注意内容 这里存储在不同的内部结构中:

< Buff行情>
>>> folder = self.folder
>>> folder.invokeFactory('Document', 'mydocument', title='My Document')
'mydocument'
>>> doc = folder.mydocument
4

让我们再次确保当我们设置 另一个大文件。这次我们将使用 put 方法,我们将确保校验和计算 已触发:

< Buff行情>
>>> folder = self.folder
>>> folder.invokeFactory('Document', 'mydocument', title='My Document')
'mydocument'
>>> doc = folder.mydocument
5

这与:

< Buff行情>
>>> folder = self.folder
>>> folder.invokeFactory('Document', 'mydocument', title='My Document')
'mydocument'
>>> doc = folder.mydocument
6

blob文件支持

一些设置:

< Buff行情>
>>> folder = self.folder
>>> folder.invokeFactory('Document', 'mydocument', title='My Document')
'mydocument'
>>> doc = folder.mydocument
7
>>> folder = self.folder
>>> folder.invokeFactory('Document', 'mydocument', title='My Document')
'mydocument'
>>> doc = folder.mydocument
8

实际测试:

< Buff行情>
>>> folder = self.folder
>>> folder.invokeFactory('Document', 'mydocument', title='My Document')
'mydocument'
>>> doc = folder.mydocument
9

让我们在内容的 文件 字段中填充一些内容:

< Buff行情>
>>> from plone.checksum import IChecksumManager
>>> manager = IChecksumManager(doc)
0

如果将文件内容设置为其他内容,则校验和将更改:

< Buff行情>
>>> from plone.checksum import IChecksumManager
>>> manager = IChecksumManager(doc)
1

用户界面

check_all 列出了zodb中存储校验和的项目 与动态计算的校验和不同:

< Buff行情>
>>> from plone.checksum import IChecksumManager
>>> manager = IChecksumManager(doc)
2

对于我们新创建的门户中相当多的对象, 未触发事件。让我们使用另一个视图来设置 所有对象与计算对象的校验和:

< Buff行情>
>>> from plone.checksum import IChecksumManager
>>> manager = IChecksumManager(doc)
3

现在, check\u all 应该给我们开绿灯:

< Buff行情>
>>> from plone.checksum import IChecksumManager
>>> manager = IChecksumManager(doc)
4

我们可以使用"全部打印"视图生成小报告。让我们说 我们对所有 门户中的对象:

< Buff行情>
>>> from plone.checksum import IChecksumManager
>>> manager = IChecksumManager(doc)
5

我们也可以按照自己的要求格式化输出。可用的键有:

< Buff行情>
>>> from plone.checksum import IChecksumManager
>>> manager = IChecksumManager(doc)
6

请注意, content\u type 仅适用于文件。那 文件名 当前仅适用于 blob产品。

这次我们将创建一个报告,其中包含所有 文件 内容对象:

< Buff行情>
>>> from plone.checksum import IChecksumManager
>>> manager = IChecksumManager(doc)
7

哦,没有文件。我们来解决这个问题。我们将创建一个假gif 文件:

< Buff行情>
>>> from plone.checksum import IChecksumManager
>>> manager = IChecksumManager(doc)
8

当我们请求"文件"字段的报告时,会得到额外的 内容输入 输出字段:

< Buff行情>
>>> from plone.checksum import IChecksumManager
>>> manager = IChecksumManager(doc)
9

这是我们期望的吗?是的:

< Buff行情>
>>> sorted(manager.keys())
['allowDiscussion', 'contributors', 'creation_date', 'creators', 'description', 'effectiveDate', 'excludeFromNav', 'expirationDate', 'id', 'language', ..., 'text', 'title']
0

如果您想在您的 门户,您可以访问:

>>> sorted(manager.keys())
['allowDiscussion', 'contributors', 'creation_date', 'creators', 'description', 'effectiveDate', 'excludeFromNav', 'expirationDate', 'id', 'language', ..., 'text', 'title']
1

cmfeditions支持

plone.checksum在查询、更新方面支持cmfeditions 和打印操作将考虑项目的版本 普通的目录搜索不会显示它们。

让我们做一些常规设置:

< Buff行情>
>>> sorted(manager.keys())
['allowDiscussion', 'contributors', 'creation_date', 'creators', 'description', 'effectiveDate', 'excludeFromNav', 'expirationDate', 'id', 'language', ..., 'text', 'title']
2

让我们创建一个文档并创建其版本:

< Buff行情>
>>> sorted(manager.keys())
['allowDiscussion', 'contributors', 'creation_date', 'creators', 'description', 'effectiveDate', 'excludeFromNav', 'expirationDate', 'id', 'language', ..., 'text', 'title']
3

现在我们将修改文档并保存当前版本。 之后,我们应该有两个版本:

< Buff行情>
>>> sorted(manager.keys())
['allowDiscussion', 'contributors', 'creation_date', 'creators', 'description', 'effectiveDate', 'excludeFromNav', 'expirationDate', 'id', 'language', ..., 'text', 'title']
4

让我们使用update方法更新所有校验和 < Buff行情>

>>> from plone.checksum import IChecksumManager
>>> manager = IChecksumManager(doc)
3

但是, 全部打印 返回第一个版本的错误校验和:

< Buff行情>
>>> sorted(manager.keys())
['allowDiscussion', 'contributors', 'creation_date', 'creators', 'description', 'effectiveDate', 'excludeFromNav', 'expirationDate', 'id', 'language', ..., 'text', 'title']
6

为什么会这样?因为我们最初没有给我们的文件 标题,因此生成的校验和用于空字符串。 全部更新 不接触旧版本。如果可以的话,它还必须存储 又是老版本。更新旧版本的校验和是 因此,这不是我们通常担心的事情。

让我们现在创建另一个版本。当 第三个版本已经就位,我们将看到最后两个版本有一个 当我们执行 全部打印时进行校验和。那是因为我们运行了update 当第二个版本是活动版本时。通常,通过 web,每次更改都会触发modified事件,因此 不用担心,它会起作用的。

< Buff行情>
>>> sorted(manager.keys())
['allowDiscussion', 'contributors', 'creation_date', 'creators', 'description', 'effectiveDate', 'excludeFromNav', 'expirationDate', 'id', 'language', ..., 'text', 'title']
7

在我们继续之前,让我们确保我们能找回第二个 版本并获取其校验和:

< Buff行情>
>>> sorted(manager.keys())
['allowDiscussion', 'contributors', 'creation_date', 'creators', 'description', 'effectiveDate', 'excludeFromNav', 'expirationDate', 'id', 'language', ..., 'text', 'title']
8

现在我们更新所有校验和并打印它们:

< Buff行情>
>>> sorted(manager.keys())
['allowDiscussion', 'contributors', 'creation_date', 'creators', 'description', 'effectiveDate', 'excludeFromNav', 'expirationDate', 'id', 'language', ..., 'text', 'title']
9

这是我们期望的吗?是的:

< Buff行情>
>>> original = str(manager['title'])
>>> print original
f796979e29808c04f422574ac403baeb
0

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java:在新文件()中传递字符串变量;   java正则表达式模式匹配器失败   反射“特殊属性/属性”,而不是Java中的getter/setter,以避免锅炉板代码   java“NoSuchMethodError”是什么意思?   java文件名、目录名或卷标语法不正确Kotlin Maven   使用java查找主机名时,性能线程进入阻塞状态。网地址。getLocalHost   java如何解决此连接配置强制转换异常?   java我不确定如何将我当前基于lwjgl的引擎与Jbox2D结合使用   在这个mergesort实现中,每次都会调用java合并   Java避免传递已检查的异常   java如何从表中创建与值连接的序列   Java 8可选版本中flatMap的签名