如何在没有上下文的情况下访问“plone站点对象”?

时间:2013-12-09 13:33:14

标签: plone zope

我有一个需要访问plone站点对象的预定作业(我正在使用apscheduler.scheduler lib),但在这种情况下我没有上下文。我订阅了IProcessingStart个事件,但遗憾的是getSite()函数返回了None

此外,是否有一种以编程方式从Zope Server root获取特定的Plone站点?

其他信息:

我有这样的工作:

from zope.site import hooks

sched = Scheduler()

@sched.cron_schedule(day_of_week="*", hour="9", minute="0")
def myjob():
    site = hooks.getSite()
    print site
    print site.absolute_url()
    catalogtool = getToolByName(site, "portal_catalog")
    print catalogtool

APScheduler作业中site变量始终为None。我们需要有关该网站的信息才能正确运行该作业。

我们避免使用公共URL执行,因为用户可以直接执行作业。

1 个答案:

答案 0 :(得分:5)

首先使用setSite()和可能的请求对象构建上下文:

from zope.app.component.hooks import setSite
from Testing.makerequest import makerequest

app = makerequest(app)
site = app[site_id]
setSite(site)

这确实需要您自己打开ZODB连接并自行遍历站点对象。

但是,您从调度程序访问Plone站点 的方式并不清楚。考虑从调度作业调用URL,而不是运行全新的Zope进程。如果将APScheduler集成到Zope进程中,则必须在作业中创建新的ZODB连接,从根遍历Plone站点,并使用上述方法设置站点挂钩(需要很多本地连接)组件无论如何)。