rt,今天看《flask Web开发》一书中,有示例代码:
创建一个文件Config.py保存配置:
...
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
#...各种其他配置变量在此省略
@staticmethod
def init_app(app):
pass
class DevelopmentConfig(Config):
#该环境下特有配置,省略
class TestingConfig(Config):
#该环境下特有配置,省略
class ProductionConfig(Config):
#该环境下特有配置,省略
config = {
'development': DevelopmentConfig,
'testing': TestingConfig,
'production': ProductionConfig,
'default': DevelopmentConfig
}
总体意思是创建基类Config来保存通用配置 其他的各环境使用不同的配置 再用一个字典提供选择
但是Config
类最后定义一个静态方法init_app
,并且函数体为空:
@staticmethod
def init_app(app):
pass
之后在另一个文件中的程序工厂函数:
...
bootstrap = Bootstrap()
mail = Mail()
moment = Moment()
db = SQLAlchemy()
def create_app(config_name):
app = Flask(__name__)
#将指定的配置通过from_object()方法导入app.config字典配置对象
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)
return app
其中使用init_app
的部分我就看不懂了,具体达到的效果是将之前在config.py中定义的配置给到这四个实例,但是init_app
函数的函数体不是空的么?为什么可以达到效果?还是说init_app
是flask特有的用来初始化配置的方法?
1
alvy 2015-10-15 23:19:04 +08:00
求解答啊,我也遇到此问题
|
2
shierji 2016-08-20 17:56:46 +08:00
不知道楼主搞清楚没= =
|
3
Tony 2016-08-24 19:09:56 +08:00
后面四个 init_app()是 Bootstrap 等类中定义的方法,用来初始化和那些类有关的配置。和 Config 类中的 init_app()不是一个函数。
|
4
beneon 2017-11-08 11:15:58 +08:00
http://flask.pocoo.org/docs/0.12/patterns/appfactories/
flask 文档关于工厂模式里面提到了上面的这种套路。 It ’ s preferable to create your extensions and app factories so that the extension object does not initially get bound to the application. Using Flask-SQLAlchemy, as an example, you should not do something along those lines: def create_app(config_filename): app = Flask(__name__) app.config.from_pyfile(config_filename) db = SQLAlchemy(app) But, rather, in model.py (or equivalent): db = SQLAlchemy() and in your application.py (or equivalent): def create_app(config_filename): app = Flask(__name__) app.config.from_pyfile(config_filename) from yourapplication.model import db db.init_app(app) |