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
)

 


你可能感兴趣的:(python)