源码看Flask框架配置管理(2)

注意:Flask中所有配置名称都是大写。上面DEBUG配置中,如果写成了debug,那就会在app.config中添加一个debug的配置,而不是修改DEBUG,开启调试模式就会失败。

也可以调用字典类中的一些方法,例如调用update方法一次性设置多个值:

from flask import Flask app = Flask(__name__) app.config.update( DEBUG=True, TESTING=True ) print('debug:', app.config.get('DEBUG')) print('testing:', app.config.get('TESTING'))

甚至可以将一些默认配置中没有的值存入配置中:

from flask import Flask app = Flask(__name__) app.config['aaaaa'] = '我是aaaaa' print(app.config['aaaaa'])

输出:

我是aaaaa

对于一些小应用来说,这种确实很是简单方便,但是对于更为复杂的应用,可能需要针对不同的环境使用不同的配置,配置的内容又多,这种方法就显得麻烦了。这时候就需要用到Config类中实现的几个方法了。

4 配置方式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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/9d8d5bd5e5492a644daa78646057f54b.html