Skip to main content
 首页 » 编程设计

python之Plone 3.1.2之ATDocument.getText() 方法中的类型错误

2025年05月04日8飞鱼

我的任务是从 Plone 3.1.2 网站卸载内容并将有关内容的信息加载到 SQL 数据库 + 文件系统

我重新创建了网站,获得了对 ZODB 的访问权限,并重新创建了对象和文件夹结构。我还能够读取文件夹、文件和文档的属性。我无法使用 ATDocument 的 .getText() 方法。回溯看起来像这样:

回溯(最近调用最后):

  File "C:\Users\jan\Eclipse_workspace\Plone\start.py", line 133, in ?  
    main()  
  File "C:\Users\jan\Eclipse_workspace\Plone\start.py", line 118, in main  
    print dokument.getText()  
  File "e:\Program Files\Plone 3\Data\Products\Archetypes\ClassGen.py", line 54, in generatedAccessor 
  File "e:\Program Files\Plone 3\Data\Products\Archetypes\BaseObject.py", line 828, in Schema  
TypeError: ('Could not adapt', <ATDocument at /*object_path*>, <InterfaceClass Products.Archetypes.interfaces._schema.ISchema>)  

我怀疑将对象连接到 ISchema 接口(interface)有问题,但我以前从未使用过 Plone,也不知道它是对象模型。

有什么建议可能是错的或遗漏的,我该如何解决它和/或下一步该做什么?我怀疑我必须以某种方式将 ISchema 接口(interface)类与该对象连接起来,但不知道从哪里开始。有什么建议么?

我将非常感谢任何帮助,因为我现在被困了 2 天并且没有前进。

我对 ZCML 格式或如何编辑它一无所知。 因为在 >>> 在 Debug模式下打印 dokument.getText() 之后脚本跳转到 Generator 类中的 makeMethod() 方法我假设脚本不执行 .getText() 但尝试创建此方法。

由于 inspect.getmembers(dokument) 返回一个 getText() 方法,我真的很困惑。 您知道哪个 ZCML 文件可能与 ATDocument 类相关吗?或者我在哪里可以找到关于这个主题的任何信息?

除了以下导入之外,我的 start.py 文件没有做太多其他事情:

from ZODB.FileStorage import FileStorage 
from ZODB.DB import DB 
from OFS.Application import Application 
from BTrees import OOBTree 
from Products.CMFPlone.Portal import PloneSite 

然后它可以访问 dokument 对象并尝试执行 .getText()

编辑 213-03-26 15:27(格林威治标准时间):

关于 .zcml 文件 我收到的网站有 3 个文件夹:Products(提取到 \Plone 3\Data)、lib 和 package-includes。

在 lib 中有一个包含 3 个子文件夹的 python 文件夹:'common'、'abc' 和 'def'(名称更改为不泄露客户信息)。这些子文件夹中的每一个都包含一个 configure.zcml 文件,其中一个还包含 override.zcml 文件。

在文件夹 package-includes 中有 4 个文件,每个文件 1 行。它们包含以下几行:

<include package="abc" file="configure.zcml" /> 
<include package="def" file="overrides.zcml" /> 
<include package="common" file="configure.zcml" /> 
<include package="def" file="configure.zcml" /> 

这些 zcml 文件目前没有被复制。我在哪里可以复制这些以导入这些?

请您参考如下方法:

您缺少组件注册,通常是在站点中加载 ZCML 文件时注册的。

您希望最终能够运行 bin/instance run yourscript.py,这会将所有繁琐的站点和 ZCML 加载到 Zope。

一旦你让它可靠地运行,你就可以在设置本地组件管理器和安全管理器的脚本中访问该站点:

from zope.app.component.hooks import setSite 
from Testing.makerequest import makerequest 
from AccessControl.SecurityManagement import newSecurityManager 
 
site_id = 'Plone'     # adjust to match your Plone site object id. 
admin_user = 'admin'  # usually 'admin', probably won't need adjusting 
app = makerequest(app) 
site = app[site_id] 
setSite(site) 
user = app.acl_users.getUser(admin_user).__of__(site.acl_users) 
newSecurityManager(None, user) 
 
# `site` is your Plone site, now correctly set up 

将此脚本保存在某处,然后运行它:

bin/instance run path/to/yourscript.py