处理请求后,如何使用after_request装饰器关闭连接?我使用before_request打开每个api请求的连接,如下所示:
使用sqlalchemy core 1.0.8和Postgresql 9.5:
#engine = create_engine(os.environ.get("DB_URL"))
DB_URL="postgresql://mowner:passwd@localhost/mydb"
@app.before_request
def before_request():
engine = create_engine(DB_URL, strategy='threadlocal')
conn = engine.connect()
@app.after_request
def after_request(conn):
if conn is not None:
print 'closing connection'
conn.close()
示例api调用:
@app.route('/api/v1.0/categories', methods=['GET'])
def categories_list():
'''
Return categories list
'''
if 'id' in session:
categories_list = []
s = select([categories])
rs = conn.execute(s)
if rs.rowcount > 0:
for r in rs:
categories_list.append(dict(r))
rs.close()
# print 'this doesnt execute'
return jsonify({'categories list': categories_list}), 200
return jsonify({'message': "UNAUTHORIZED"}), 401
视图是api调用,仅返回对象列表,已添加或编辑对象和消息.如何准确地将连接对象传递给after_request装饰器?我真的不能遵循文档
确切的代码将对我有所帮助.
解决方法:
您可以使用flask.g来引用创建全局db连接对象并在任何地方使用它
from flask import Flask, g
#engine = create_engine(os.environ.get("DB_URL"))
DB_URL="postgresql://mowner:passwd@localhost/mydb"
@app.before_request
def before_request():
engine = create_engine(DB_URL, strategy='threadlocal')
conn = engine.connect()
g.db = conn
然后像这样在您的路线中使用连接
@app.route('/api/v1.0/categories', methods=['GET'])
def categories_list():
'''
Return categories list
'''
if 'id' in session:
categories_list = []
s = select([categories])
rs = g.db.execute(s) # change in variable
if rs.rowcount > 0:
for r in rs:
categories_list.append(dict(r))
rs.close()
# print 'this doesnt execute'
return jsonify({'categories list': categories_list}), 200
return jsonify({'message': "UNAUTHORIZED"}), 401
然后最后像这样关闭它:
@app.after_request
def after_request(response):
if g.db is not None:
print 'closing connection'
g.db.close()
return response
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。