直接修改config对象

flask会有一个可用的配置对象保存着载入的配置值: Flask 对象的 **config **属性,这是 Flask 自己放置特定配置值的地方,也是扩展可以存储配置值的地方。但是,你也可以把自己的配置保存到这个对象里

app = Flask(__name__)
app.config['DEBUG'] = True

你可以使update()方法来一次性更新多个键:

app.config.update(
DEBUG=True,
SECRET_KEY='...'
)

从文件配置

  • from_object()

    • 接收的参数为string或类,该类的属性名称必须为大写

    原理解析

    from_object用法

    app.config.from_object(config[config_name])

    app.config属性由make_config方法获得

    app.py

    self.config = self.make_config(instance_relative_config)   # 395

    我们看看make_config方法都做了什么:

    config.py

    def make_config(self, instance_relative=False):  # 652
    root_path = self.root_path
    if instance_relative:
    root_path = self.instance_path
    defaults = dict(self.default_config)
    defaults['ENV'] = get_env()
    defaults['DEBUG'] = get_debug_flag()
    return self.config_class(root_path, defaults)

    app.py

    config_class = Config # 207

    config.py

    class Config(dict):   # 40
    xxx

    由源代码可知该方法返回了一个config_class,config_class即Config类,也就是说app.config是Config类生成的对象,这个对象的root_path为self.root_path,defaults为dict(self, default_config)。我们再看看他们的值

    app.py

    root_path = None   #351
    default_config = ImmutableDict({      # 281
    'ENV': None,
    'DEBUG': None,
    'TESTING': False,
    'PROPAGATE_EXCEPTIONS': None,
    'PRESERVE_CONTEXT_ON_EXCEPTION': None,
    'SECRET_KEY': None,
    'PERMANENT_SESSION_LIFETIME': timedelta(days=31),
    'USE_X_SENDFILE': False,
    'SERVER_NAME': None,
    'APPLICATION_ROOT': '/',
    'SESSION_COOKIE_NAME': 'session',
    'SESSION_COOKIE_DOMAIN': None,
    ...
    })

    root_path默认为None(当我们指定instance_relative_config=True的时候,root_path=instance_path,这个和实例文件夹的配置有关,稍后再讲),default_config是继承(多继承)了dict类的实例,其中的值就是我们默认的配置值,这些配置项在flask初始化的时候就会读取,我们修改的也是这些配置项,这就是为什么修改的配置对象的 key必须要大写的原因。

    我们看看from_object做了什么:

    config.py

    def from_object(self, obj):   # 141
    if isinstance(obj, string_types):
    obj = import_string(obj)
    for key in dir(obj):
    if key.isupper():
    self[key] = getattr(obj, key)

    对string类型的对象进行了一些处理,最后更改指定key的value,即default_config中的值

    • from_object 用法

      config.py

      class Config(object):
      DEBUG = False
      TESTING = False
      DATABASE_URI = 'sqlite://:memory:' class ProductionConfig(Config):
      DATABASE_URI = 'mysql://user@localhost/foo' class DevelopmentConfig(Config):
      DEBUG = True class TestingConfig(Config):
      TESTING = True config = {
      'development': DevelopmentConfig,
      'test': TestingConfig,
      'production': ProductionConfig,
      'default': DevelopmentConfig
      }
      from config import config
      app.config.from_object(config['default'])
  • from_pyfile()

    • 在 Flask 0.8 中,引入了 Flask.instance_path 并提出了“实例文件夹” 的新概念。实例文件夹为不使用版本控制和特定的部署而设计。这是放置运行时更改的文件和配置文件的最佳位置

    • 你可以在创建 Flask 应用时显式地提供实例文件夹的路径

      app = Flask(__name__, instance_path='/path/to/instance/folder')
    • 如果instance_path 参数没有赋值,会使用下面默认的位置

      /myapp.py
      /instance
    • 配置 Flask 来从模块预载入配置并覆盖配置文件夹中配置文件的完整例子

    • app = Flask(__name__, instance_relative_config=True)     # 从相对实例文件夹读取配置开关
      app.config.from_object('yourapplication.default_settings') # 预载入配置
      app.config.from_pyfile('application.cfg', silent=True) # 覆盖原配置
    • application.cfg位于instance文件夹下

    • 直接读取实例文件夹中配置的方法

      filename = os.path.join(app.instance_path, 'application.cfg')   # 方法1
      with open(filename) as f:
      config = f.read() # or via open_instance_resource:
      with app.open_instance_resource('application.cfg') as f: # 方法2
      config = f.read()
  • from_envvar()

    • Flask给我们提供了根据环境变量选择一个配置文件的能力。 这意味着我们可以在我们的版本库中有多个配置文件,并总是能根据具体环境,加载到对的那个

    • app.config.from_envvar(‘APP_CONFIG_FILE’)将加载由环境变量APP_CONFIG_FILE指定的文件。这个环境变量的值应该是一个配置文件的绝对路径

      APP_CONFIG_FILE=/var/www/yourapp/config/production.py
  • 综合应用

    app = Flask(__name__, instance_relative_config=True)
    app.config.from_object('config.default')
    app.config.from_pyfile('config.py') # 从instance文件夹中加载配置
    app.config.from_envvar('APP_CONFIG_FILE')
    • config.py为公用配置项
    • envvar控制不同环境变量的不同配置项,flask能根据具体环境,加载到对应的配置文件
  • 结语

    • 一个简单的应用仅需一个配置文件:config.py或配置对象
    • instance文件夹可以用来改变特定环境下的程序配置。
    • 应对复杂的,基于环境的配置,我们可以结合环境变量和app.config.from_envvar()来使用

最新文章

  1. yum常用命令
  2. C段旁注工具CCC.exe
  3. Golang里面使用protobuf(proto3)
  4. ListView的监听器中OnItemClick各个参数的作用
  5. Theano2.1.18-基础知识之theano的扩展
  6. linux freetds操作mssql
  7. CI框架SESSION重写
  8. Mybatis学习——一对一关联表查询
  9. iOS 8版本信息与屏幕尺寸
  10. linux下vi命令大全(转载)
  11. 特么的. 最终把 amobbs 的站长阿莫(莫进明)给回骂了一顿.
  12. SQLServer树形数据结构的数据进行数据统计
  13. JavaScript二维码生成——qrcode.js
  14. Java IO使用入门
  15. 音频传输之Jitter Buffer设计与实现
  16. PDO错误调试
  17. 在Office应用中打开WPF窗体并且让子窗体显示在Office应用上
  18. 【清北学堂2018-刷题冲刺】Contest 2
  19. Docker命令详解(run篇)
  20. 转载一篇介绍CUDA

热门文章

  1. python基础---字符串常用方法汇总
  2. 数组的查找,删除 Day07
  3. Python 变量赋值
  4. lattice planner 规划详解
  5. js280行代码写2048
  6. Data Flow-File Read-详细过程
  7. 2019-2-11-WPF-获取应用的所有窗口
  8. 学习CSS预处理器Less
  9. H3C 无线网络典型部署-热点覆盖
  10. tensorflow入门——5tensorflow安装