2013-12-09 4 views
1

Plone 사이트 개체에 액세스해야하는 예약 된 작업이 있습니다 (apscheduler.scheduler lib를 사용하고 있습니다).이 경우 컨텍스트가 없습니다. 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 변수는 항상 APScheduler 작업 내부 None입니다. 그리고 우리는 사이트를 올바르게 운영하기위한 정보가 필요합니다.

사용자가 직접 작업을 실행할 수 있으므로 공용 URL을 사용하지 않아도됩니다.

+1

Plone 사이트와 정확히 얼마나 일하고 있습니까? 왜 사이트에서 특정 URL을 실행하지 않습니까? –

+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 사이트로 이동 한 다음 위의 방법을 사용하여 사이트 후크를 설정해야합니다 (많은 로컬 작업에 필요함) 어쨌든 구성 요소).

관련 문제