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