2017-10-11 92 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参考。