使用工廠函數(shù)不會(huì)直接創(chuàng)建 app 實(shí)例這個(gè)全局變量,而是通過(guò) create_app() 函數(shù)創(chuàng)建,再返回 app 對(duì)象。
演示一個(gè)項(xiàng)目使用工廠函數(shù)的例子,用上 flask_sqlalchemy,flask_migrate,flask_bootstrap 等擴(kuò)展庫(kù)。
文檔結(jié)構(gòu):
/app
__init__.py
models.py
routes.py
config.py
run.py
# __init__.py
from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_bootstrap import Bootstrap
db = SQLAlchemy()
migrate = Migrate()
bootstrap = Bootstrap()
def create_app():
app = Flask(__name__)
# 加載配置文件
app.config.from_object(Config)
# 初始化各種擴(kuò)展庫(kù)
db.init_app(app)
migrate.init_app(app, db)
bootstrap.init_app(app)
# 引入藍(lán)圖并注冊(cè)
from app.routes import main_routes
app.register_blueprint(main_routes)
return app
from app import models
調(diào)用工廠函數(shù)創(chuàng)建 app。
# run.py
from app import create_app, db
app = create_app()
因?yàn)椴淮嬖谌肿兞?app 了,所以 routes 里面的路由函數(shù)也不能直接注冊(cè)成 @app.route('/') 這種形式,應(yīng)當(dāng)使用藍(lán)圖(Blueprint)來(lái)管理路由。
# routers.py
main_routes = Blueprint('main', __name__)
@main_routes .route('/index')
def index():
…………
本文源碼:https://github.com/SingleDiego/Flask-Application-Factories