2011-12-17 1 views
4

저는 Flask와 MongoDB를 사용하여 파이썬으로 webapp을 작성하려고합니다 (그리고 아마도 Ming as ODM). 문제는 필자의 모델과 컨트롤러를 정말 잘 분리하고 싶기 때문에 별도의 구성 요소에서 간단한 단위 테스트를 실행할 수있는 한 가지 이유가 있습니다.테스트 가능한 방식으로 mongodb에 연결하기

이제 MongoDB에 연결해야하는 요청주기의 어느 시점에서 문제가 발생했습니다. 각 요청에는 별도의 연결이 있습니다. 플라스크는 요청에 글로벌 인 모든 변수를 포함 할 수있는 스레드 로컬 객체를 제공합니다. 이것은 몽고 연결을 설정하는 데 좋은 장소 인 것 같습니다. 그러나 이렇게하면 데이터 영역과 Flask간에 딱딱한 종속성이 생기므로이를 테스트하거나 별도로 실행하는 것이 어렵습니다.

내 질문은 정말 거기에 우아한 솔루션이 있는지 여부입니다. 나는 몇 가지 옵션을 스스로 고안했지만, 그들은 우아한 것과는 거리가 멀다.

먼저 데이터 모듈에 연결 개체를 가져올 위치를 알려주는 함수를 제공 할 수 있습니다. 또는 비슷한 방법으로 새 ​​연결을 가져 오는 데 사용할 수있는 함수를 전달하십시오.

두 번째 옵션은 모듈이 MongoDB에 연결하기 위해 사용할 수있는 클래스를 만든 다음 Flask의 전역 개체를 사용하는 버전과 MongoDB에 연결하는 두 가지 버전을 만드는 것입니다.

이 두 가지 모두 나에게 정말 강력하거나 우아하지는 않지만,이 방법을 더 잘 활용할 수 있습니까?

답변

5

한 가지 방법은 파이썬 모듈 수준의 싱글 톤 패턴을 사용하는 것입니다. 풀로 돌아가려면 여기를 conn.end_request()

class Model(object): 
    def __init__(self, table, db = app.config['DB_NAME']): 
     self._table = table 
     self._db = db 

    def find_one(self, spec_or_id=None, *args, **kwargs): 
     result = None 
     try: 
      result = conn[self._db][self._table].find_one(spec_or_id, *args, **kwargs) 
     except InvalidName: 
      app.logger.critical('invalid DB or Table name') 
     finally: 
      conn.end_request() 

     return result 

의 원인이됩니다 단지 PyMongo 수집에 대한 래퍼를 생성 (그냥 일반 PyMongo를 사용하여) 갖는 '코네티컷'객체 연결을 다음

try: 
    conn = Connection(max_pool_size=20) 
except ConnectionFailure: 
    app.logger.critical("Unable to connect to MongoDB") 

및 모듈을 만들고 각 find_one()에서 풀에서 연결을 가져옵니다. 걱정하지 마십시오. 스레드로부터 안전합니다.

지금 당신은

result = Model(COLLECTION).find_one({user:'joe'}) 
+0

하지만이 정말 아직도 오른쪽의 app.config에 대한 술병을 필요로한다는 의미에서 플라스크에서 모델을 분리하지 않습니다 같은 모델 뭔가를 사용할 수 있습니까? – Blubber

+0

app.config는 사용자가 볼 수있는 것처럼 DB_NAME을 가져 오는 데 사용됩니다. 원한다면 당신은 그것의 탈을 얻을 수 있습니다. – sojin

관련 문제