2013-09-03 3 views
0

zodb와 cherrypy를 사용하고 있습니다. 나는 jinja2 템플릿에 데이터를 전달하고있다. 템플릿 렌더링을 반환하기 전에 내 zodb 연결을 닫고 싶습니다.cherrypy에서 데이터베이스와의 표준 연결을 끊는 방법은 무엇입니까?

데이터가 zodb 데이터이기 때문에 템플릿을 렌더링 할 때 연결이 필요하기 때문에 데이터를 렌더링 할 수 없습니다. 이미 반환 끝났어 후

이 오류를 ...

zconn.close() #zconn.close closes the conn,db, and storage 
return template.render(args....) 

은 어떻게 ZODB의 CONN를 폐쇄합니까? "요청 전"과 "요청 후"함수가 있습니까? 항상 db 연결을 정의 할 수 있습니까? 체리 피 문서는 "노출 된 함수의 시작 부분에 명시 적으로 수행하고 반환하기 전에 닫습니다"라는 점을 제외하고는 데이터베이스 연결에 대한 명시적인 내용이 없습니다.

아니면 말을하는 표준 방법입니다 ...

page = template.render(args...) 
zconn.close() 
return page 

답변

1

요청이 완료 될 경우에만 예, 연결을 종료에 표준 방법입니다.

가능한 가장 가까운 순간을 연기하십시오.

from contextlib import contextmanager 

@contextmanager 
def zodbconn(db): 
    conn = db.open() 
    yield conn.root() 
    conn.close() 

는 사용 : 사용 당신을위한 마감을 처리하기 위해 컨텍스트 관리자를 사용할 수

with zodbconn(db) as zconn: 
    return template.render(args....) 

와 연결이 자동으로 return 문이 처리 된 후 를 종료됩니다.

+0

@MKaras : 확실하지만 먼저 연결을 열고 각 메소드에서 컨텍스트 관리자로'with (zconn) :'을 사용해야합니다. –

관련 문제