flask學習筆記(工廠函式)
阿新 • • 發佈:2019-01-05
最近flask理解又進了一步,記錄一下。
關於工廠函式:
bootstrap = Bootstrap() mail = Mail() moment = Moment() db = SQLAlchemy() pagedown = PageDown() login_manager = LoginManager() login_manager.session_protection = 'strong' login_manager.login_view = 'auth.login' def create_app(config_name): app = Flask(__name__) app.config.from_object(config[config_name]) config[config_name].init_app(app) bootstrap.init_app(app) mail.init_app(app) moment.init_app(app) db.init_app(app) login_manager.init_app(app) pagedown.init_app(app)
app = create_app(os.getenv('FLASK_CONFIG') or 'default')
這裡flask web 開發那本書沒有說到的一點就是,flask的所有擴充套件都被設計成了可以先建立應用程式,然後再匯入app 應用變數,因為如上面的 db=sqlalchemy() 都是全域性的,而app 則可以有不止一個,所以設計成了先建立應用程式擴充套件,再繫結app,再通過form_object匯入 實現好的config 配置 其中的一些配置在通過init_app傳入相應程式中,最後通過 crate_app()來進行呼叫, os.getenv()來獲取環境變數中的flask_config.然後執行。
最後我要說一句,google的oauth2認證,真的好坑啊... 我要哭了...
————————————————————————————————update(備忘)
來自知乎專欄: https://zhuanlan.zhihu.com/flask
1、例項化擴充套件類
在一個小的程式裡,可以直接匯入擴充套件類,傳入當前的程式例項(即“app”):
from flask import Flask
from flask_bootstrap import Bootstrap
app = Flask(__name__)
bootstrap = Bootstrap(app)
2、使用初始化方法
每個擴充套件都會提供一個初始化方法:init_app()。擴充套件在這個方法里加載相應的配置,實現初始化操作。一個典型的例子:
flask_bootstrap/__init__.py
class Bootstrap(object):
def __init__(self, app=None):
if app is not None:
self.init_app(app)
def init_app(self, app):
app.config.setdefault('BOOTSTRAP_USE_MINIFIED', True)
app.config.setdefault('BOOTSTRAP_CDN_FORCE_SSL', False)
# ...
在這裡可以看到,如果使用上一種方法,例項化Bootstrap並傳入程式例項,同樣會呼叫init_app()方法。
在使用工廠函式來建立程式時,我們這樣初始化擴充套件:
from flask import Flask
from flask_bootstrap import Bootstrap
from config import config
bootstrap = Bootstrap() # 不傳入程式例項
def create_app(config):
app = Flask(__name__)
app.config.from_object(config)
bootstrap.init_app(app)
return app
把這個函式存為單獨的檔案,然後在你的程式主腳本里使用app = create_app()來建立程式例項。
直接寫入主指令碼
當你的程式很小的時候,可以直接把配置寫在主腳本里:
from flask import Flask
app = Flask(__name__)
app.config['SECRET_KEY'] = 'some secret words'
app.config['DEBUG'] = True
app.config['ITEMS_PER_PAGE'] = 10
使用字典的update方法可以簡化程式碼:
from flask import Flask
app = Flask(__name__)
app.config.update(
DEBUG=True,
SECRET_KEY='some secret words',
ITEMS_PER_PAGE=10
)