我正在写一个连接到数据库的应用程序。我想创建一次数据库连接,然后在应用程序的整个生命周期中重用该连接。Flask:设置应用程序和特定于请求的属性?
我也想认证用户。用户的身份验证将仅存在于请求的生命周期中。
如何区分储存在烧瓶应用程序中的对象与特定于请求的对象?我会在哪里存储它们以便所有模块(和随后的蓝图)都可以访问它们?
这里是我的示例应用程序:
from flask import Flask, g
app = Flask(__name__)
@app.before_first_request
def setup_database(*args, **kwargs):
print 'before first request', g.__dict__
g.database = 'DATABASE'
print 'after first request', g.__dict__
@app.route('/')
def index():
print 'request start', g.__dict__
g.current_user = 'USER'
print 'request end', g.__dict__
return 'hello'
if __name__ == '__main__':
app.run(debug=True, port=6001)
当我运行这个(瓶0.10.1)并导航到http://localhost:6001/
,这里是在控制台中显示的内容:
$ python app.py
* Running on http://127.0.0.1:6001/
* Restarting with reloader
before first request {}
after first request {'database': 'DATABASE'}
request start {'database': 'DATABASE'}
request end {'current_user': 'USER', 'database': 'DATABASE'}
127.0.0.1 - - [30/Sep/2013 11:36:40] "GET/HTTP/1.1" 200 -
request start {}
request end {'current_user': 'USER'}
127.0.0.1 - - [30/Sep/2013 11:36:41] "GET/HTTP/1.1" 200 -
也就是说,第一个请求按预期工作:flask.g
持有我的数据库,并且当请求开始时,它也具有我的用户信息。
但是,经我第二次请求,flask.g被擦干净了!我的数据库无处可查。
现在,我知道flask.g 使用只适用于请求。但现在它已经绑定到应用程序(从0.10开始),我想知道如何将变量绑定到整个应用程序,而不仅仅是一个请求。
我错过了什么?
编辑:我特别感兴趣的MongoDB - 在我的情况下,维护连接到多个Mongo数据库。我最好只在__init__.py
中创建这些连接并重用这些对象?
关于'flask.g':“从Flask 0.10开始,它存储在应用程序上下文中,不再存在于请求上下文中,这意味着如果只有应用程序上下文被绑定而不是请求,它就变为可用。 - 烧瓶文件http://flask.pocoo.org/docs/0.12/api/#flask.g – Raymond