2017-10-11 83 views
0

我正在開發燒瓶微服務以暴露cassandra數據庫中的一些數據。從命令行調用gunicorn。問題在於,我對於在何處以及如何連接數據庫感到困惑,尤其是在進行單元測試時考慮如何模擬或繞過數據庫的需求。燒瓶post-fork連接到cassandra

我第一次嘗試是在創建應用程序時連接如下

def create_app(): 
    app = Flask(__name__) 

    app.debug = True 

    cluster = Cluster([os.environ['CASSANDRA_HOST']]) 
    app.cassandra = cluster.connect(os.environ['CASSANDRA_KEYSPACE']) 

    return app 

認爲它會讓每個單獨的請求一個「全球性」連接減少開銷。這顯然不能通過單元測試,因爲它會嘗試連接,這不是CI管道隔離環境中單元測試的要點。

然後,從卡桑德拉人檢查一些slides它說燒瓶使用@app.before_first_request,並作爲連接「後叉」的一般規則。我不確定在這種情況下後叉的含義。

總之,做

@app.before_first_request 
def before_request(): 
    app.cluster = Cluster([os.environ['CASSANDRA_HOST']]) 
    app.cassandra = app.cluster.connect(os.environ['CASSANDRA_KEYSPACE']) 

也可以,但是仍然有孤立的單元測試同樣的問題。

通過閱讀這個post,我想我沒有連接本身的問題,因爲我正在創建一個由gunicorn(post-fork)產生的每個瓶子實例的cassandra會話。

然後,我的問題將減少能夠單元測試端點而不必明確達到數據庫的策略。

回答

0

總的想法是每個進程都有一個集羣/會話,在叉上創建並保存爲進程生命週期。大多數服務器提供了一個post-fork'hook'來設置像這樣的資源。

的Gunicorn鉤記錄here

uWSGI類似物是在driver FAQ參考。