init_app 静态方法是 flask 特有给 config 类的吗?

2015-08-04 13:46:09 +08:00
 rundix

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特有的用来初始化配置的方法?

3173 次点击
所在节点    问与答
4 条回复
alvy
2015-10-15 23:19:04 +08:00
求解答啊,我也遇到此问题
shierji
2016-08-20 17:56:46 +08:00
不知道楼主搞清楚没= =
Tony
2016-08-24 19:09:56 +08:00
后面四个 init_app()是 Bootstrap 等类中定义的方法,用来初始化和那些类有关的配置。和 Config 类中的 init_app()不是一个函数。
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)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/210678

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX