都说的不太好,g 对象虽然可以,但是不符合 flask 的约定,虽然 flask 对这块管的毕竟宽松,但是使用扩展的约定其实是最好的
example:
```python
class Sqlite:
def __init__(self):
def __init__(self, app=None):
self.app = app
if app is not None:
self.init_app(app)
def init_app(self, app):
app.config.setdefault('SQLITE3_DATABASE', ':memory:')
app.teardown_appcontext(self.teardown)
def connect(self):
return sqlite3.connect(current_app.config['SQLITE3_DATABASE'])
def teardown(self, exception):
ctx =
_app_ctx_stack.top if hasattr(ctx, 'sqlite3_db'):
ctx.sqlite3_db.close()
@
property def connection(self):
ctx =
_app_ctx_stack.top if ctx is not None:
if not hasattr(ctx, 'sqlite3_db'):
ctx.sqlite3_db = self.connect()
return ctx.sqlite3_db
```
这里的 teardown 函数就是 flask 的应用情境的上下文,也就是说,在请求后关闭 sqlite
当然,如果在请求外的时候则:
```python
with app.app_context():
cur = db.connection.cursor()
cur.execute(...)
```
这样的好处就是在请求环境下你可以直接 import 你的 Sqlite 对象用,不需要 request.g.sqllite,初始化也是符合约定
```python
db = Sqlite()
app.init_app(db)
# OR
db = Sqlite(app)
```