我正在寫一個連接到數據庫的應用程序。我想創建一次數據庫連接,然後在應用程序的整個生命週期中重用該連接。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