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://[email protected]/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()来使用

原文地址:https://www.cnblogs.com/iamluoli/p/11189470.html

时间: 2024-10-05 17:33:56

flask配置详解的相关文章

使用LVS实现负载均衡原理及安装配置详解

转:http://www.cnblogs.com/liwei0526vip/p/6370103.html 使用LVS实现负载均衡原理及安装配置详解 负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F5.Netscale.这里主要是学习 LVS 并对其进行了详细的总结记录. 一.负载均衡LVS基本介绍 LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director

LVS配置详解

一.LVS系统组成 前端:负载均衡层 –      由一台或多台负载调度器构成 中间:服务器群组层 –      由一组实际运行应用服务的服务器组成 底端:数据共享存储层 –      提供共享存储空间的存储区域 二.LVS术语 Director Server:调度服务器,将负载分发到RealServer的服务器 Real Server:真实服务器,真正提供应用服务的服务器 VIP:虚拟IP地址,公布给用户访问的IP地址 RIP:真实IP地址,集群节点上使用的IP地址 DIP:Director连

logback logback.xml 常用配置详解

一:根节点 包含的属性: scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true. scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒.当scan为true时,此属性生效.默认的时间间隔为1分钟. debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态.默认值为false. 例如: <configuration scan="true" scan

php-fpm的配置详解

php5.3自带php-fpm /usr/local/php/etc/php-fpm.confpid = run/php-fpm.pidpid设置,默认在安装目录中的/var/run/php-fpm.pid,建议开启 error_log = log/php-fpm.log错误日志,默认在安装目录中的/var/log/php-fpm.log log_level = notice错误级别. 可用级别为: alert(必须立即处理), error(错误情况), warning(警告情况), notic

varnish安装及配置详解

varnish系统架构: varnish主要运行两个进程:Management进程和Child进程(也叫Cache进程). Management进程主要实现应用新的配置.编译VCL.监控varnish.初始化varnish以及提供一个命令行接口等.Management进程会每隔几秒钟探测一下Child进程以判断其是否正常运行,如果在指定的时长内未得到Child进程的回应,Management将会重启此Child进程. Child进程包含多种类型的线程,常见的如:Acceptor线程:接收新的连接

Windows下Nginx Virtual Host多站点配置详解

Windows下Nginx Virtual Host多站点配置详解 此教程适用于Windows系统已经配置好Nginx+Php+Mysql环境的同学. 如果您还未搭建WNMP环境,请查看 windows7配置Nginx+php+mysql教程. 先说明一下配置多站点的目的:在生产环境中,如果将系统所有代码文件都放在公开目录中,则很容易被查看到系统源码,这样是很不安全的,所以需要只公开index.php的入口文件目录.而同一个服务器中,可能运行多个系统,这样就必须公开多个入口文件目录,以便用不同的

linux FTP配置详解

一.vsftpd说明: LINUX下实现FTP服务的软件很多,最常见的有vsftpd,Wu-ftpd和Proftp等.Red Hat Enterprise Linux中默认安装的是vsftpd. 访问FTP服务器时需要经过验证,只有经过了FTP服务器的相关验证,用户才能访问和传输文件.vsftpd提供了3种ftp登录形式:  (1)anonymous(匿名帐号) 使用anonymous是应用广泛的一种FTP服务器.如果用户在FTP服务器上没有帐号,那么用户可以以anonymous为用户名,以自己

Log4J日志配置详解

一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使用这三个组件可以轻松地记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置. 1.Loggers Loggers组件在此系统中被分为五个级别:DEBUG.INFO.WARN.ERROR和FATAL.这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR <

keepalived的配置详解(非常详细)

keepalived的配置详解(非常详细) 2017-01-22 15:24 2997人阅读 评论(0) 收藏 举报  分类: 运维学习(25)  转载自:http://blog.csdn.net/u010391029/article/details/48311699 1. 前言 VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,最新协议在RFC3768中定义,原来的定义RFC2338被废除,新协议相对还简化了一些功能. 2. 协议说