v2ex 的处女贴,奉献给 flask 。
刚开始学 flask ,还没时间看 sqlalchemy 。
python2.7 , flask 0.10.1 。数据库是 oracle ,使用了 cx_Oracle 作为驱动。
按以往的经验,在创建了一个连接池,每次有请求进行时从池子中获取获取一个 connection ,访问 db 后,把 connection release 回池中。
民
问题:
1 、看打出来的日志,只初始化了一次连接池,结果出来两次“ connect db ”。
2 、对于 app_context 的使用还是很困惑。
何时需要 app_context , app_context 是否是唯一的?
如何把池的信息附加到 app_context ,使在每次的 request 时都可以正确获取到。
附件 1 : db.py
import cx_Oracle as cxo
from flask import current_app
try:
from flask import _app_ctx_stack as stack
except ImportError:
from flask import _request_ctx_stack as stack
class OraDB(object):
def __init__(self, app=None):
self.app = app
if app is not None:
self.init_app(app)
def init_app(self, app):
if hasattr(app, 'teardown_appcontext'):
app.teardown_appcontext(self.teardown)
else:
app.teardown_request(self.teardown)
print 'connect db'
ctx = app.app_context()
ctx.push()
self.pool = cxo.SessionPool(user=current_app.config['DBUSER'], \
password=current_app.config['DBPASSWORD'], \
dsn=current_app.config['DSN'], \
min=current_app.config['MIN'], \
max=current_app.config['MAX'], \
increment=current_app.config['INCREMENT'], threaded=True)
def connect(self):
conn = self.pool.acquire()
print 'in connect: pool id:', id(self.pool), ' conn id:', id(conn)
return conn
def teardown(self, exception):
ctx = stack.top
if hasattr(ctx, 'oradb'):
print "teardown " + str(id(ctx.oradb))
self.pool.release(ctx.oradb)
@
property
def connection(self):
ctx = stack.top
if ctx is not None:
if not hasattr(ctx, 'oradb'):
ctx.oradb = self.connect()
return ctx.oradb
附件 2 : app.py
from flask import Flask, current_app
from db import OraDB
app = Flask(__name__)
app.config.from_pyfile('config.cfg')
db = OraDB(app)
@
app.route('/')
def index():
cur = db.connection.cursor()
cur.execute("select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual")
rs = cur.fetchall()
return rs[0][0]
if __name__ == "__main__":
app.run(debug=True)