直接修改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()来使用

flask配置详解的更多相关文章

  1. (转)Nginx静态服务配置---详解root和alias指令

    Nginx静态服务配置---详解root和alias指令 原文:https://www.jianshu.com/p/4be0d5882ec5 静态文件 Nginx以其高性能著称,常用与做前端反向代理服 ...

  2. Nginx静态服务配置---详解root和alias指令

    Nginx静态服务配置---详解root和alias指令 静态文件 Nginx以其高性能著称,常用与做前端反向代理服务器.同时nginx也是一个高性能的静态文件服务器.通常都会把应用的静态文件使用ng ...

  3. Log4j配置详解(转)

    一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使 ...

  4. logback 常用配置详解<appender>

    logback 常用配置详解 <appender> <appender>: <appender>是<configuration>的子节点,是负责写日志的 ...

  5. [转]阿里巴巴数据库连接池 druid配置详解

    一.背景 java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色 ...

  6. libCURL开源库在VS2010环境下编译安装,配置详解

    libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...

  7. logback配置详解3<filter>

    logback 常用配置详解(三) <filter> <filter>: 过滤器,执行一个过滤器会有返回个枚举值,即DENY,NEUTRAL,ACCEPT其中之一.返回DENY ...

  8. logback配置详解2<appender>

    logback 常用配置详解(二) <appender> <appender>: <appender>是<configuration>的子节点,是负责写 ...

  9. log4j.properties配置详解

    1.Loggers Loggers组件在此系统中被分为五个级别:DEBUG.INFO.WARN.ERROR和FATAL.这五个级别是有顺序的,DEBUG < INFO < WARN < ...

随机推荐

  1. python for 循环结构

  2. sum(),max(),avg(),RATIO_TO_REPORT()--分组统计

    select id,area, sum(1) over() as 总记录数, sum(1) over(partition by id) as 分组记录数, sum(score) over() as 总 ...

  3. docker oracle install

    https://hub.docker.com/r/9fevrier/oracle-11g Informations Oracle directory : /opt/oracle Data direct ...

  4. 20172018-acmicpc-southeastern-european-regional-programming-contest-seerc-2017-en A - Concerts

    题意就是给一个字母序列a,以及一个另外一个字母序列b,你需要b中找到字母序列a,并且要求对于在b中的字母序列a,每个单词都需要满足相应的距离 其实很简单,我们利用DP[i][j]代表a已经匹配i个位置 ...

  5. LOJ6079「2017 山东一轮集训 Day7」养猫

    养ImmortalCO k可重区间问题 的增强版:有上下界! 直接都选择s[i],然后再把一些调整到e[i] 考虑通过最大流的“最大”,使得至少每k个有me个e, 通过最大流的“上界”,限制每k个最多 ...

  6. iptables 连线追踪(Connection tracking)

    「连線追蹤」:提供可用於判断包相关性的额外资讯.举例来說,一次FTP session同时需要两条分离的连線,控制与资料传输各一:用於追蹤FTP连線的扩充模组,运用对於FTP恊定的认知,从控制连線上流动 ...

  7. 详解TableStore模糊查询——以订单场景为例

    背景 订单系统在各行各业中广泛应用,为消费者.商家后台.促销系统等第三方提供用户.产品.订单等多维度的管理和查询服务.为了挖掘出海量订单数据的潜能,丰富高效的查询必不可少.然而很多时候并不能给出完整准 ...

  8. Android教程 -05 Android6.0权限的管理

    视频为本篇博客知识的讲解,建议采用超清模式观看, 欢迎点击订阅我的优酷 上篇文章我们讲解了通过隐式意图拨打电话,在AndroidManifest.xml文件中添加了权限 <uses-permis ...

  9. Redis正确使用的十个技巧

    http://www.jb51.net/article/73376.htm Redis 在当前的技术社区里是非常热门的.从来自 Antirez 一个小小的个人项目到成为内存数据存储行业的标准,Redi ...

  10. JAVA之NIO按行读写大文件,完美解决中文乱码问题

    ;//一次读取的字节长度 File fin = new File("D:\\test\\20160622_627975.txt");//读取的文件 File fout = new  ...