【flask】加载配置、切换配置、隐私配置

╰+攻爆jí腚メ 2022-11-21 11:18 514阅读 0赞

1.加载配置

flask加载配置的方式有多种

1)加载默认配置。flask启动时会加载默认的配置,该配置可以通过app.default_config查看,那是一个类字典类型,我们自然也可以通过直接修改它,app.config["键"] = 值

2)从类对象加载。新建一个类,然后用过app.config.from_object(类名)加载,从文件加载类似

3)从环境变量加载。from_envvar(变量名,silent=True)

main.py

  1. from flask import Flask
  2. from .settings import *
  3. app = Flask(__name__)
  4. # 查看默认配置项,app.default_config
  5. # 方案1:
  6. app.config["DEBUG"] = True
  7. print(app.config["SQL_HOST"])
  8. # 方案2:
  9. app.config.from_object(DevelopmentConfig) # 在settingspy文件中自定义配置类
  10. # app.config.from_pyfile("配置文件路径")
  11. # 方案3
  12. # export CONFIG=/XXX/secret_config.py
  13. app.config.from_envvar("CONFIG", silent=True) # silent为True,即使环境变量不存在也不会报错
  14. @app.route("/")
  15. def index():
  16. return "index page"
  17. if __name__ == '__main__':
  18. app.run()

settings.py

  1. class BaseConfig(object):
  2. DEBUG = True
  3. SECRET_KET = "asfnikahsf"
  4. class DevelopmentConfig(BaseConfig):
  5. DEBUG = True
  6. SQL_HOST = "127.0.0.1"
  7. SQL_PORT = 3306
  8. class ProductionConfig(BaseConfig):
  9. DEBUG = True
  10. SQL_HOST = "192.168.1.15"
  11. SQL_PORT_MASTER = 3306
  12. SQL_PORT_SLAVE = 8306
  13. class TestingConfig(BaseConfig):
  14. DEBUG = True
  15. SQL_HOST = "127.0.0.1"
  16. SQL_PORT = 3306

2.切换配置

上面在settings.py文件里定义了多种配置方案,但是如果需要切换的话就得修改代码,这样不利于开发和测试,我们可以使用工厂模式动态创建

settings.py

  1. class BaseConfig(object):
  2. DEBUG = True
  3. SECRET_KET = "asfnikahsf"
  4. class DevelopmentConfig(BaseConfig):
  5. DEBUG = True
  6. SQL_HOST = "127.0.0.1"
  7. SQL_PORT = 3306
  8. class ProductionConfig(BaseConfig):
  9. DEBUG = True
  10. SQL_HOST = "192.168.1.15"
  11. SQL_PORT_MASTER = 3306
  12. SQL_PORT_SLAVE = 8306
  13. class TestingConfig(BaseConfig):
  14. DEBUG = True
  15. SQL_HOST = "127.0.0.1"
  16. SQL_PORT = 3306
  17. # 定义字典来记录 配置类型 和 配置子类 之间的映射关系
  18. config_dict = {
  19. "dev": DevelopmentConfig,
  20. "pro": ProductionConfig,
  21. "test": TestingConfig
  22. }

main.py

  1. from flask import Flask
  2. from settings import config_dict
  3. def create_app(config_name):
  4. app = Flask(__name__)
  5. config_class = config_dict[config_name]
  6. app.config.from_object(config_class)
  7. return app
  8. app = create_app("dev")
  9. @app.route("/")
  10. def index():
  11. return "index page"
  12. if __name__ == '__main__':
  13. app.run()

上面的写法虽然用了工厂函数,但是依然是写死的,flask支持动态创建,格式是FLASK_APP="应用所在模块:工厂函数(参数)"

  1. $ export FLASK_APP="main:create_app('dev')" # 设置环境变量, 通过调用函数 设置配置并动态创建Flask应用
  2. $ flask run # 运行web程序

注意,如果通过动态创建应用,则之前那种通过app = create_app('dev')的方法就会失效

3.加载隐私配置

如果直接把 SECRET_KEY 定义在项目中,也可能不是很安全,还可以通过环境变量的方式加载隐私配置

我们把secret_key定义在一个py文件中,比如

secret_config.py

  1. SECRET_KEY = "kopsafgh"

main.py

  1. from flask import Flask
  2. from settings import config_dict
  3. def create_app(config_name):
  4. app = Flask(__name__)
  5. # 当silent=True,即使该环境变量不存在也不会报错
  6. app.config.from_envvar("CONFIG", silent=True)
  7. return app
  8. app = create_app("dev")
  9. @app.route("/")
  10. def index():
  11. return "index page"
  12. if __name__ == '__main__':
  13. app.run()

然后在终端执行命令

  1. $ export FLASK_APP="main" # 设置内置环境变量
  2. $ export ENV_CONFIG="/xx/secret_config.py" # 设置隐私配置对应的环境变量
  3. $ flask run # 启动web程序

发表评论

表情:
评论列表 (有 0 条评论,514人围观)

还没有评论,来说两句吧...

相关阅读