zoukankan      html  css  js  c++  java
  • flask配置详解

    直接修改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()来使用
  • 相关阅读:
    MySQL之force index和ignore index
    Linux中CPU性能分析工具perf简单使用(亲测可用)
    Linux之SeLinux
    Docker基础
    yum常用命令
    MySQL总结
    MySQL字符集详解
    MySQL5.6的4个自带库详解
    Python操作MySQL
    MySQL索引原理
  • 原文地址:https://www.cnblogs.com/iamluoli/p/11189470.html
Copyright © 2011-2022 走看看