我有一个需要访问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执行,因为用户可以直接执行作业。
答案 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站点,并使用上述方法设置站点挂钩(需要很多本地连接)组件无论如何)。