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