flask_6:Flask项目配置源码解读
目录:
1、查看app.config类型
2、查看app.config源码
3、配置方式2-对象中配置:from_object介绍
重点:
app.config.from_object() 方法说接收的参数obj可以使str类型,可以是一个模块,甚至是一个类。
1、查看app.config类型:是一个类
from flask import Flask app = Flask(__name__) print(type(app.config)) # 输出结果,是一个类 <class 'flask.config.Config'>
2、查看app.config源码:
class Config(dict): def __init__(self, root_path, defaults=None): dict.__init__(self, defaults or {}) self.root_path = root_path # 读取配置的方法 def from_envvar(self, variable_name, silent=False): pass def from_pyfile(self, filename, silent=False): pass def from_object(self, obj): pass def from_json(self, filename, silent=False): pass def from_mapping(self, *mapping, **kwargs): pass
查看源码可知,app.config是一个类,继承的是dict类,然后添加了一些几个读取配置的方法,所以app.config可以使用字典的方法,用直接赋值的方法加载配置,也可以用上面定义的几个方法加载配置。
3、配置方式2-对象中配置:from_object(推荐)
先来看看from_object()方法的源码:
def from_object(self, obj):
if isinstance(obj, string_types): # 判断obj是否是str类型
obj = import_string(obj) # 如果是str类型,就根据这个字符串导入对象
for key in dir(obj): # 遍历obj的所有值
if key.isupper():
self[key] = getattr(obj, key) # self指的就是config实例本身,通过getattr取出对应的值进行
从源码可以看出,from_object()方法说接收的参数obj可以使str类型,可以是一个模块,甚至是一个类。
我们先尝试一下是一个模块的情况,创建一个settings.py模块,内容如下:
DEBUG = False
TESTING = False
这里只写了两个配置,你可以写更多,无所谓。怎么使用呢?
from flask import Flask
import settings
app = Flask(__name__)
app.config.from_object(settings)
print('DEBUG:', app.config.get('DEBUG'))
print('TESTING:', app.config.get('TESTING'))
print('A:', app.config.get('A'))
输出:
DEBUG: True
TESTING: True
A: 123
当obj是一个字符串时:
from flask import Flask
app = Flask(__name__)
app.config.from_object('settings')
print('DEBUG:', app.config.get('DEBUG'))
print('TESTING:', app.config.get('TESTING'))
print('A:', app.config.get('A'))
输出:
DEBUG: True
TESTING: True
A: 123
看出来了吗?无论是使用app.config.from_object(settings)还是app.config.from_object('settings')使用的都是使用settings.py文件中的配置,至于原因,如果不明白就回去看看上面的源码。
如果obj是一个类时,我们修改一下settings.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
在settings.py模块中,我们定义了多个类,首先是Config类,这个类定义的是默认配置,其他类都继承Config类,每一个之类代表一种配置,如果需要子类中可以覆写Config,如果不覆写则使用Config中的默认配置。怎么使用呢?
from flask import Flask
import settings
app = Flask(__name__)
app.config.from_object(settings.ProductionConfig)
print('DEBUG:', app.config.get('DEBUG'))
print('TESTING:', app.config.get('TESTING'))
print('DATABASE_URI:', app.config.get('DATABASE_URI'))
输出:
DEBUG: False
TESTING: False
DATABASE_URI: mysql://user@localhost/foo
使用这种方法的好处是可以充分利用面向对象中继承等的优良特性共享配置,设置多套配置,使用时,只需要针对实际需要修改app.config.from_object(settings.ProductionConfig)中传入的类即可。这种方法在实际开发中也是使用最多的。
本文参考自:从源码看Flask框架配置管理
其他几种加载方式都在原博客中讲述,且原博主文章质量很高,讲解通熟易懂,排版清晰明朗,已关注原博主,建议看到的小伙伴关注。