如何在Plone 6插件的控制台脚本中访问站点?
在Plone 6控制台脚本中访问Plone站点
在Plone 6中,你可以通过Zope 5的API初始化应用环境并获取Plone站点,替代Plone 4中的get_plone_site功能。以下是完整实现方案:
完整脚本示例 (my/addon/scripts/do_something.py)
from zope.app.appsetup.bootstrap import ensureRootFolder from zope.app.wsgi import WSGIPublisherApplication from Products.CMFPlone.Portal import PloneSite import transaction import argparse import os def get_plone_site(app, site_id='Plone'): """获取指定ID的Plone站点,未指定则返回第一个找到的Plone站点""" # 优先查找指定ID的站点 if site_id in app: site = app[site_id] if isinstance(site, PloneSite): return site # 遍历根目录查找第一个Plone站点 for obj in app.values(): if isinstance(obj, PloneSite): return obj raise ValueError("未找到可用的Plone站点") def main(): parser = argparse.ArgumentParser(description="Plone控制台脚本示例") parser.add_argument('--site-id', default='Plone', help='目标Plone站点的ID') parser.add_argument('--zodb-path', default='var/filestorage/Data.fs', help='ZODB文件路径或ZEO连接字符串') parser.add_argument('--zope-config', default='etc/zope.ini', help='Zope配置文件路径') args = parser.parse_args() # 设置环境变量,让Zope应用加载正确配置 os.environ['ZEO_CLIENT'] = args.zodb_path os.environ['ZAPP_CONFIG'] = args.zope_config # 初始化Zope应用实例 app = WSGIPublisherApplication() ensureRootFolder(app) try: # 获取Plone站点 site = get_plone_site(app, args.site_id) print(f"成功连接到Plone站点: {site.id}") # -------------------------- # 在这里编写你的业务逻辑 # 示例:获取站点标题 print(f"当前站点标题: {site.title}") # 示例:创建新文档 # doc = site.invokeFactory('Document', id='new-doc', title='新文档') # transaction.commit() # 有数据修改时需提交事务 # -------------------------- finally: # 关闭ZODB连接,避免资源泄漏 app._p_jar.close() if __name__ == '__main__': main()
关键说明
环境初始化:
- 通过
WSGIPublisherApplication()初始化Zope应用,这是Plone 6推荐的WSGI兼容方式 ensureRootFolder(app)确保Zope根目录存在,避免初始化错误
- 通过
站点查找逻辑:
- 优先按指定
site_id查找站点,适配多站点部署场景 - 未找到指定ID时,自动遍历根目录返回第一个Plone站点实例
- 优先按指定
事务与资源管理:
- 若脚本修改了Plone数据,必须调用
transaction.commit()提交更改 - 最终通过
app._p_jar.close()关闭ZODB连接,防止资源泄漏
- 若脚本修改了Plone数据,必须调用
运行注意事项:
- 优先在Plone实例根目录下运行脚本,或通过
--zodb-path和--zope-config指定正确路径 - 若使用ZEO集群,将
--zodb-path设为ZEO连接字符串(如zeo://localhost:8100)
- 优先在Plone实例根目录下运行脚本,或通过
内容的提问来源于stack exchange,提问作者GhitaB
相关产品推荐
相关产品推荐

