2013-08-25 1 views
1

WebApp2, SQLAlchemy, Apache, PostgrSQL 등을 사용하여 웹 응용 프로그램을 만들고 있습니다. config 파일에 데이터베이스 자격 증명을 저장하고 scoped_session을 사용하여 세션 개체를 만듭니다. 지금 내 모든보기 파일이 설정 파일을 가져 와서 사용하는 세션 객체를 다음과 같이 :SQLAlchemy scoped_session :보기를 가져 오는 최상의 방법

some_view.py 
import config 

def view(): 
    query = config.session.query(bla bla) 

이러한 접근 방식은 최종 아니다 나는 최선의 방법을 사용하고 싶습니다.

은 내가 여기에 달성하고자하는 것은보기 함수의 실행 후 세션 개체가 닫혀 있도록 붙박이 방법과 관련된 장식 또는 webapp2를 사용하여 세션 객체를 얻기의 몇 가지 방법입니다. 나는 많은 방법을 시도했지만 그것을 성취 할 수 없었다. 작동중인 스 니펫을 높이 평가할 것입니다.

더 나은 접근 방법을 가진 사람이면 누구나 제안하십시오.

감사

편집 -----

@javex : 제안 주셔서 감사합니다. 호출시에 scoped_session 객체를 반환하고 작업이 완료되면 세션을 닫는 데코레이터 클래스를 찾고 있습니다. 참고로 여기에 샘플 코드가 있지만 작동하지 않습니다.

class GetDBSession(object): 
    """Decorator class to create DB session object""" 
    def __init__(self): 
     self.session = scoped_session(sessionmaker(bind=database_engine)) 

    def __exit__(self): #Dont know if it works 
     self.session.close() 

    def __call__(self): #Dont know if it works 
     return self.session 

그리고 나는이처럼 사용하려면 :

@GetDBSession() 
def view_func(): 
    #work with session object here 

답변

0

내가하지만 난 당신이 요청 처리의 마지막에 커밋 뭔가를 원하는 것입니다 무엇을 얻을에서 많은 WebApp2에 대해 알고하지 않으며, 대신 예외가 있으면 롤백합니다. 당신이 적응할 수있는 몇 가지 해결책이 있습니다.

우선, When do I construct a Session, when do I commit it, and when do I close it?을 읽어 보시기 바랍니다. 각각 조프 거래에

은 SQLAlchemy의 통합 및 플라스크 프레임 워크 : 그것은이 개 특히 유용 프레임 워크 통합을위한 확장에 대한 단락을 가지고있다. 결국, 당신이 원하는 것은 요청 처리 주위에 뭔가를 구축하는 것입니다 :

try: 
    result = handle_request(request) 
    config.session.commit() 
except: 
    config.session.rollback() 
    raise 

예외가없는 경우에만, 다른 커밋 것이 롤백과 함께 예외를 전달합니다. 이를 통합하는 방법은 WebApp2와이 통합을 허용하는 방법에 따라 다릅니다. 많은 프레임 워크는 위와 같은 일종의 "처리 전"접근법을 제공합니다. 요청을 처리 할 콜백을 얻습니다. 먼저 요청을 처리 한 다음 콜백을 호출하고 그 후에 처리 할 수 ​​있습니다. 이렇게하면이 깔끔한 try/except 래퍼를 사용할 수 있습니다.

관련 문제