1. 程式人生 > >flask學習筆記(工廠函式)

flask學習筆記(工廠函式)

        最近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
)