[英]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.