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()来使用
flask配置详解的更多相关文章
- (转)Nginx静态服务配置---详解root和alias指令
Nginx静态服务配置---详解root和alias指令 原文:https://www.jianshu.com/p/4be0d5882ec5 静态文件 Nginx以其高性能著称,常用与做前端反向代理服 ...
- Nginx静态服务配置---详解root和alias指令
Nginx静态服务配置---详解root和alias指令 静态文件 Nginx以其高性能著称,常用与做前端反向代理服务器.同时nginx也是一个高性能的静态文件服务器.通常都会把应用的静态文件使用ng ...
- Log4j配置详解(转)
一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使 ...
- logback 常用配置详解<appender>
logback 常用配置详解 <appender> <appender>: <appender>是<configuration>的子节点,是负责写日志的 ...
- [转]阿里巴巴数据库连接池 druid配置详解
一.背景 java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色 ...
- libCURL开源库在VS2010环境下编译安装,配置详解
libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...
- logback配置详解3<filter>
logback 常用配置详解(三) <filter> <filter>: 过滤器,执行一个过滤器会有返回个枚举值,即DENY,NEUTRAL,ACCEPT其中之一.返回DENY ...
- logback配置详解2<appender>
logback 常用配置详解(二) <appender> <appender>: <appender>是<configuration>的子节点,是负责写 ...
- log4j.properties配置详解
1.Loggers Loggers组件在此系统中被分为五个级别:DEBUG.INFO.WARN.ERROR和FATAL.这五个级别是有顺序的,DEBUG < INFO < WARN < ...
随机推荐
- 安装pip3遇到:E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).
安装pip3遇到:E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution). 具 ...
- 在springmvc中 @RequestMapping(value={"", "/"})是什么意思
这个意思是说请求路径 可以为空或者/ 我给你举个例子:比如百度知道的个人中心 访问路径是 http://zhidao.baidu.com/ihome,当然你也可以通过 http://zhidao.ba ...
- PAN-OS 6.1 Open Source Software (OSS) Listing
https://www.paloaltonetworks.com/documentation/oss-listings/oss-listings/pan-os-oss-listings/pan-os- ...
- 安装visualStudio 出现 cant install Microsoft.TeamFoundation.OfficeIntegration.Resources
本文告诉大家在安装 VisualStudio 时出现cant install Microsoft.TeamFoundation.OfficeIntegration.Resources如何安装 如果在安 ...
- js读取cookie 根据cookie名称获取值、赋值
借鉴:原作者https://blog.csdn.net/zouxuhang/article/details/80548417 //方法1 //存在问题:如果cookie中存在 aaaname= ...
- Reasoning and Learing学习笔记
Assignment 1 question 1 1.clisp安装及运行->参考博客 2.参数为列表,参考PPT 3.把嵌套列表变成非嵌套->题目P07 代码
- git 删除时报 the branch is not fully merged 这是什么意思
今天删除本地分支 git branch -d XX 提示: the branch XXX is not fully merged原因:XXX分支有没有合并到当前分支的内容 解决方法:使用大写的D 强制 ...
- Python--day23--组合
- H3C 在接口上应用ACL
- [转][Linux/Ubuntu] vi/vim 使用方法讲解
vi/vim 基本使用方法 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的 ...