Flask Web | Flask 配置管理

使用文件集中管理 app.config 的设置项,可通过三种方式加载配置文件

Posted by Haauleon on November 13, 2022

本篇所有操作均在基于 Ubuntu 16.04 LTS 的虚拟机下完成,且使用 Vagrant 来操作虚拟机系统,虚拟机系统 VirtualBox Version: 7.0



一、Flask 内置的配置变量

环境准备:
Python 2.7.11+
pip==9.0.3
flask==0.11.1
werkzeug==0.11.10

  复杂的项目需要配置各种环境,app.config 内置的全部配置变量可以参考:官方文档,先打印看看 flask 的 0.11.1 版本提供的内置配置变量有哪些:

1
2
3
4
5
# coding=utf-8
from flask import Flask

app = Flask(__name__)
print app.config

执行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<Config {
    'JSON_AS_ASCII': True, 
    'USE_X_SENDFILE': False, 
    'SESSION_COOKIE_PATH': None, 
    'SESSION_COOKIE_DOMAIN': None, 
    'SESSION_COOKIE_NAME': 'session', 
    'SESSION_REFRESH_EACH_REQUEST': True, 
    'LOGGER_HANDLER_POLICY': 'always', 
    'LOGGER_NAME': '__main__', 
    'DEBUG': False, 
    'SECRET_KEY': None, 
    'EXPLAIN_TEMPLATE_LOADING': False, 
    'MAX_CONTENT_LENGTH': None, 
    'APPLICATION_ROOT': None, 
    'SERVER_NAME': None, 
    'PREFERRED_URL_SCHEME': 'http', 
    'JSONIFY_PRETTYPRINT_REGULAR': True, 
    'TESTING': False, 
    'PERMANENT_SESSION_LIFETIME': datetime.timedelta(31), 
    'PROPAGATE_EXCEPTIONS': None, 
    'TEMPLATES_AUTO_RELOAD': None, 
    'TRAP_BAD_REQUEST_ERRORS': False, 
    'JSON_SORT_KEYS': True, 
    'JSONIFY_MIMETYPE': 'application/json', 
    'SESSION_COOKIE_HTTPONLY': True, 
    'SEND_FILE_MAX_AGE_DEFAULT': datetime.timedelta(0, 43200), 
    'PRESERVE_CONTEXT_ON_EXCEPTION': None, 
    'SESSION_COOKIE_SECURE': False, 
    'TRAP_HTTP_EXCEPTIONS': False
}>



二、管理 app.config 设置项

  一般会根据项目需要,自由添加设置项,包括但不限于 app.config 内置的配置变量,这里提供了三种方式进行设置项的管理。


1、硬编码

如果设置项很少,可以直接硬编码进来,比如下面的方式:

1
2
3
4
5
6
7
# coding=utf-8
from flask import Flask

app = Flask(__name__)
app.config['DEBUG'] = True

print app.config

执行可知设置项 DEBUG 已成功设置为 True

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<Config {
    'JSON_AS_ASCII': True, 
    'USE_X_SENDFILE': False, 
    'SESSION_COOKIE_PATH': None, 
    'SESSION_COOKIE_DOMAIN': None, 
    'SESSION_COOKIE_NAME': 'session', 
    'SESSION_REFRESH_EACH_REQUEST': True, 
    'LOGGER_HANDLER_POLICY': 'always', 
    'LOGGER_NAME': '__main__', 
    'DEBUG': True, 
    'SECRET_KEY': None, 
    'EXPLAIN_TEMPLATE_LOADING': False, 
    'MAX_CONTENT_LENGTH': None, 
    'APPLICATION_ROOT': None, 
    'SERVER_NAME': None, 
    'PREFERRED_URL_SCHEME': 'http', 
    'JSONIFY_PRETTYPRINT_REGULAR': True, 
    'TESTING': False, 
    'PERMANENT_SESSION_LIFETIME': datetime.timedelta(31), 
    'PROPAGATE_EXCEPTIONS': None, 
    'TEMPLATES_AUTO_RELOAD': None, 
    'TRAP_BAD_REQUEST_ERRORS': False, 
    'JSON_SORT_KEYS': True, 
    'JSONIFY_MIMETYPE': 'application/json', 
    'SESSION_COOKIE_HTTPONLY': True, 
    'SEND_FILE_MAX_AGE_DEFAULT': datetime.timedelta(0, 43200), 
    'PRESERVE_CONTEXT_ON_EXCEPTION': None, 
    'SESSION_COOKIE_SECURE': False, 
    'TRAP_HTTP_EXCEPTIONS': False
}>



2、更新数据结构 dict

app.config 是 flask.config.Config 类的实例,继承自 Python 内置数据结构 dict,所以可以使用 update 方法更新设置项:

1
2
3
4
5
6
7
8
9
10
11
# coding=utf-8
from flask import Flask

app = Flask(__name__)

app.config.update(
    DEBUG=True,
    SECRET_KEY='abcdefg123456789'
)

print app.config

执行可知设置项 DEBUG 已成功设置为 TrueSECRET_KEY 已成功设置为 abcdefg123456789

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<Config {
    'JSON_AS_ASCII': True, 
    'USE_X_SENDFILE': False, 
    'SESSION_COOKIE_PATH': None, 
    'SESSION_COOKIE_DOMAIN': None, 
    'SESSION_COOKIE_NAME': 'session', 
    'SESSION_REFRESH_EACH_REQUEST': True, 
    'LOGGER_HANDLER_POLICY': 'always', 
    'LOGGER_NAME': '__main__', 
    'DEBUG': True, 
    'SECRET_KEY': 'abcdefg123456789', 
    'EXPLAIN_TEMPLATE_LOADING': False, 
    'MAX_CONTENT_LENGTH': None, 
    'APPLICATION_ROOT': None, 
    'SERVER_NAME': None, 
    'PREFERRED_URL_SCHEME': 'http', 
    'JSONIFY_PRETTYPRINT_REGULAR': True, 
    'TESTING': False, 
    'PERMANENT_SESSION_LIFETIME': datetime.timedelta(31), 
    'PROPAGATE_EXCEPTIONS': None, 
    'TEMPLATES_AUTO_RELOAD': None, 
    'TRAP_BAD_REQUEST_ERRORS': False, 
    'JSON_SORT_KEYS': True, 
    'JSONIFY_MIMETYPE': 'application/json', 
    'SESSION_COOKIE_HTTPONLY': True, 
    'SEND_FILE_MAX_AGE_DEFAULT': datetime.timedelta(0, 43200), 
    'PRESERVE_CONTEXT_ON_EXCEPTION': None, 
    'SESSION_COOKIE_SECURE': False, 
    'TRAP_HTTP_EXCEPTIONS': False
}>



3、使用配置文件

如果设置项很多,想要集中管理设置项,应该把它们存放到一个文件里。例如设置一个名为 settings.py 的配置文件:

1
2
3
4
A = 1
B = 2
C = 3
D = 4



三、加载配置文件

上述添加了 settings.py 配置文件后,需要在执行文件的 app.config 配置中加载该配置文件的内容,app.config 支持以下三种方式加载配置文件。


1、通过配置文件加载

方式一:以字符串的名字传入模块名字

1
2
3
4
5
6
7
# coding=utf-8
from flask import Flask

app = Flask(__name__)
app.config.from_object('settings')

print app.config

执行可知 settings.py 配置文件的内容已全部添加进 app.config 中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<Config {
    'JSON_AS_ASCII': True, 
    'USE_X_SENDFILE': False, 
    'C': 3, 
    'B': 2, 
    'D': 4, 
    'SESSION_COOKIE_PATH': None, 
    'SESSION_COOKIE_DOMAIN': None, 
    'SESSION_COOKIE_NAME': 'session', 
    'SESSION_REFRESH_EACH_REQUEST': True, 
    'LOGGER_HANDLER_POLICY': 'always', 
    'A': 1, 
    'LOGGER_NAME': '__main__', 
    'DEBUG': False, 
    'SECRET_KEY': None, 
    'EXPLAIN_TEMPLATE_LOADING': False, 
    'MAX_CONTENT_LENGTH': None, 
    'APPLICATION_ROOT': None, 
    'SERVER_NAME': None, 
    'PREFERRED_URL_SCHEME': 'http', 
    'JSONIFY_PRETTYPRINT_REGULAR': True, 
    'TESTING': False, 
    'PERMANENT_SESSION_LIFETIME': datetime.timedelta(31), 
    'PROPAGATE_EXCEPTIONS': None, 
    'TEMPLATES_AUTO_RELOAD': None, 
    'TRAP_BAD_REQUEST_ERRORS': False, 
    'JSON_SORT_KEYS': True, 
    'JSONIFY_MIMETYPE': 'application/json', 
    'SESSION_COOKIE_HTTPONLY': True, 
    'SEND_FILE_MAX_AGE_DEFAULT': datetime.timedelta(0, 43200), 
    'PRESERVE_CONTEXT_ON_EXCEPTION': None, 
    'SESSION_COOKIE_SECURE': False, 
    'TRAP_HTTP_EXCEPTIONS': False
}>


方式二:引用文件后直接传入模块对象

1
2
3
4
5
6
7
8
# coding=utf-8
from flask import Flask
import settings

app = Flask(__name__)
app.config.from_object(settings)

print app.config

执行结果跟方式一是一致的。



2、通过文件名字加载

直接传入文件名字,但是不限于只使用 .py 后缀的文件名:

1
2
3
4
5
6
7
# coding=utf-8
from flask import Flask

app = Flask(__name__)
app.config.from_pyfile('settings.py', silent=True)  # 默认当配置文件不存在时会抛出异常,使用 silent=True 的时候只是返回 False 不会抛出异常

print app.config



3、通过环境变量加载

这种方式依然支持 silent 参数,获得路径后其实还是使用 from_pyfile 的方式加载:

1
2
❯ export MYAPPLICATION_SETTINGS='settings.py'
app.config.from_envvar('MYAPPLICATION_SETTINGS')