注意: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