簡體   English   中英

處理Flask API中的多個連接

[英]Handle multiple connections in Flask API

我正在使用Flask為我們的解決方案編寫一個簡單的內部REST API,通過get調用(包括身份驗證)提供JSON對象。 我們有多個后端來從中獲取數據。 根據我的理解,這些應該在用@app.before_request修飾的函數中連接,並分配給g global以用於所請求的特定路由。 這不是我習慣的模式。

這是我正在做的一個玩具示例:

@app.before_request
def before_request():
    g.some_conn_a = create_connection('a')
    g.some_conn_b = create_connection('b')
    g.some_client = create_client()


@app.route('/get_some_data')
@requires_auth
def get_some_data():
    # Fetch something from all connections in g
    payload = ... # Construct payload using above connections
    return jsonify(payload)


@app.route('/get_some_other_data')
@requires_auth
def get_some_other_data():
    # Fetch something from maybe just g.some_conn_b
    payload = ... # Construct payload using g.some_conn_b
    return jsonify(payload)

如果用戶請求僅駐留在這些連接/客戶端中的一個或兩個中的get_some_other_data例如get_some_other_data路由示例),這對我來說似乎是浪費的。

我正在考慮改為在路由功能中建立連接/客戶端,或者懶惰地加載它。 什么是“正確”的方式? 我希望不要制作一個新的模塊,這對我正在做的事情來說似乎極端。

Flask docs數據庫連接示例進行重復操作,您可以修改get_db()以接受每個多個連接的參數。

def get_db(conn):
    """Open specificied connection if none yet for the current app context. """
    if conn == 'some_conn_a':
        if not hasattr(g, 'some_conn_a'):
            g.some_conn_a = create_connection('a')
        db = g.some_conn_a
    elif conn == 'some_conn_b':
        if not hasattr(g, 'some_conn_b'):
            g.some_conn_b = create_connection('b')
        db = g.some_conn_b 
    elif conn == 'some_client':
        if not hasattr(g, 'some_client'):
            g.some_client = create_client()
        db = g.some_client
    else:
        raise Exception("Unknown connection: %s" % conn)

    return db

@app.teardown_appcontext
def close_db(error):
    """Closes the db connections. """
    if hasattr(g, 'some_conn_a'):
        g.some_conn_a.close()
    if hasattr(g, 'some_conn_b'):
        g.some_conn_b.close()
    if hasattr(g, 'some_client'):
        g.some_client.close()

然后,您可以根據需要查詢每個連接:

@app.route('/get_some_data')
def get_some_data():
    data_a = get_db('some_conn_a').query().something()
    data_b = get_db('some_conn_b').query().something()
    data_c = get_db('some_client').query().something()
    payload = {'a': data_a, 'b': data_b, 'c': data_c}
    return jsonify(payload)

對於延遲加載數據庫連接, get_db()模式優先於before_request模式。 Flask 0.11及更高版本的文檔示例更大程度地利用了get_db()模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM