《flask Web开发》中关于init_app 静态方法的作用是什么?

《flask Web开发》第七章中,有config的代码:

创建一个文件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来保存通用配置 其他的各环境使用不同的配置 再用一个字典提供选择

但是不懂静态方法init_app的具体作用是什么?一个空函数可以做什么?

@staticmethod
def init_app(app):
    pass

在__init__.py中使用它:

...

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

求解答,谢谢....

阅读 10.3k
5 个回答

这是一个类(静态)方法,与实例无关。
应该是用来对应用启动时初始化用的,只是现在没有去写里面的方法而已。

新手上路,请多包涵

因为你的配置方法不止一种,但都是继承自基类Config,自然地,其他配置类也会继承这个init_app()作为一个接口,同时可以加上它们各自不同的实现。

新手上路,请多包涵

config中的init_app()方法是作者自定义的一个初始化方法,这个你去看看python静态方法就懂了;
其实令人迷惑的是其他的bootstrap.init_app(app)类似这样的xx.init_app(),这个其实是这些Flask扩展自带的初始化方法,和你定义在config.py中的init_app()没有任何关系,我也迷惑了很久233333。

下面这段代码是可以直接运行的:

hello.py

from flask import Flask, render_template
from flask_bootstrap import Bootstrap
from flask_moment import Moment

app = Flask(__name__)

bootstrap = Bootstrap()
moment = Moment()

bootstrap.init_app(app)
moment.init_app(app)


@app.route('/')
def joke():
    return render_template('404.html')


if __name__ == '__main__':
    app.run()

404.html

新手上路,请多包涵

困惑就困惑在后面的bootstrap.init_app这部分。。原来本身这个扩展就带这个函数啊

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏