V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
rundix
V2EX  ›  问与答

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

  •  
  •   rundix · 2015-08-04 13:46:09 +08:00 · 3279 次点击
    这是一个创建于 3404 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    4 条回复    2017-11-08 11:15:58 +08:00
    alvy
        1
    alvy  
       2015-10-15 23:19:04 +08:00
    求解答啊,我也遇到此问题
    shierji
        2
    shierji  
       2016-08-20 17:56:46 +08:00
    不知道楼主搞清楚没= =
    Tony
        3
    Tony  
       2016-08-24 19:09:56 +08:00
    后面四个 init_app()是 Bootstrap 等类中定义的方法,用来初始化和那些类有关的配置。和 Config 类中的 init_app()不是一个函数。
    beneon
        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)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3898 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 10:20 · PVG 18:20 · LAX 02:20 · JFK 05:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.