2013-12-09 68 views
1

我有一个计划任务(我使用apscheduler.scheduler lib)需要访问plone站点对象,但在这种情况下我没有上下文。我订阅了IProcessingStart事件,但不幸getSite()函数返回None如何在没有上下文的情况下访问“plone站点对象”?

此外,有没有一种编程方式从Zope Server根获取特定的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 

site变量始终是一个None工作APScheduler里面。我们需要关于网站的信息来正确运行这项工作。

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

+1

您究竟如何在Plone网站上运行这项工作?为什么不在网站中执行某个网址? –

+0

嗨,Martijn。我添加一些信息并试图回答你的问题。 有没有办法getSite()返回一个有效的值(一个站点对象),而无需打开ZODB连接,如下面的答案所示? –

+1

不,你不能从某处加载它。我不熟悉APScheduler,但是如果它涉及一个单独的线程来执行预定的工作,那么你需要打开一个新的ZODB连接并从那里加载Plone站点,并用该对象调用'setSite()'。 –

回答

4

建立一个上下文先用setSite(),也许一个请求对象:

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

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

这确实需要你自己打开ZODB连接和遍历站点对象自己。

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

相关问题