Flask的配置
无论什么应用都是需要配置,它可以让我们根据应用环境做出不同的修改,比如Flask的切换调试模式、设置密钥或者一些特定的变量路径等等。
Flask被设计为需要配置来启动应用,但基本的配置Flask都是为我们设置了,所以我们可以不进行任何配置就启动Flask应用。那么如何设置配置,有一个可用的配置对象保存着载入的配置值:Flask对象config属性。
配置基础
config属性继承于字典,可以像字典一样修改它:
1 | app=Flask(__name__) |
2 | app.config['DEBUG']=True |
给定的配置会被推送到Flask对象,所以可以这样读写:
1 | app.debug=True |
设置可以使用dict.update()方法来一次性更新多个键:
1 | app.config.update( |
2 | DEBUG=True |
3 | SECRET_KEY='...' |
4 | ) |
内置的配置值
Flask内部使用:
- DEBUG: 启用/禁用调试模式
- TESTING: 启用/禁用测试模式
- PROPAGATE_EXCEPTIONS: 显式地允许或禁用异常传播。如果没有设置或显式地设置为None,当TESTING或DEBUG为真时,隐式为真
- PRESERVE_CONTEXT_ON_EXCEPTION: 默认情况下,如果应用工作在调试模式,请求上下文不会在异常时出栈来允许调试器内省。这可以通过这个键来禁用。你同样可以用这个设定来强制启用,它即使没有调试执行,这对调试生产应用很有用(但风险也很大)
- SECRET_KEY: 密钥
- SESSION_COOKIE_NAME: 会话cookie的名称
- SESSION_COOKIE_DOMAIN: 会话cookie的域。如果不设置这个值,则cookie对SERVER_NAME的全部子域名有效
- SESSION_COOKIE_PATH: 会话cookie的路径。如果不设置这个值,且没有给‘/’设置过,则cookie对APPLICATION_ROOT下的所以路径有效
- SESSION_COOKIE_HTTPONLY: 控制cookie是否应被设置httponly的标志。默认True
- SESSION_COOKIE_SECURE: 控制cookie是否应被设置安全标志,默认为False
- PERMANENT_SESSION_LIFETIME: 以datetime.timedelta对象控制长期会话的生存时间
- SESSION_REFRESH_EACH_REQUEST: 这个标志控制永久会话如何刷新。如何被设置为True(这是默认值),每一个请求cookie都会被刷新,如果设置为False,只有当cookie被修改后才会发送一个set-cookie标头
- USE_X_SENDFILE: 启用/禁用x-sendfile
- LOGGER_NAME: 日志记录器的名称
- SERVER_NAME: 服务器名和端口。需要这个选项来支持子域名(例如: ‘myapp.dev:5000’)。注意localhost不支持子域名,所以把这个选项设置为 “localhost” 没有意义。设置 SERVER_NAME 默认会允许在没有请求上下文而仅有应用上下文时生成 URL
- APPLICATION_ROOT: 如果应用不占用完整的域名或子域名,这个选项可以被设置为应用所在的路径。这个路径也会用于会话 cookie 的路径值。如果直接使用域名,则留作 None
- MAX_CONTENT_LENGTH: 如果设置为字节数, Flask 会拒绝内容长度大于此值的请求进入,并返回一个 413 状态码
- SEND_FILE_MAX_AGE_DEFAULT: 默认缓存控制的最大期限,以秒计,在 flask.Flask.send_static_file() (默认的静态文件处理器)中使用。对于单个文件分别在 Flask 或 Blueprint 上使用 get_send_file_max_age() 来覆盖这个值。默认为 43200(12小时)。
- TRAP_HTTP_EXCEPTIONS: 如果这个值被设置为 True ,Flask不会执行 HTTP 异常的错误处理,而是像对待其它异常一样, 通过异常栈让它冒泡地抛出。这对于需要找出 HTTP 异常源头的可怕调试情形是有用的
。 - TRAP_BAD_REQUEST_ERRORS: Werkzeug 处理请求中的特定数据的内部数据结构会抛出同样也是“错误的请求”异常的特殊的 key errors 。同样地,为了保持一致,许多操作可以显式地抛出 BadRequest 异常。因为在调试中,你希望准确地找出异常的原因,这个设置用于在这些情形下调试。如果这个值被设置为 True ,你只会得到常规的回溯。
- PREFERRED_URL_SCHEME: 生成URL的时候如果没有可用的 URL 模式话将使用这个值。默认为 http
- JSON_AS_ASCII: 默认情况下 Flask 使用 ascii 编码来序列化对象。如果这个值被设置为 False , Flask不会将其编码为 ASCII,并且按原样输出,返回它的 unicode 字符串。比如 jsonfiy 会自动地采用 utf-8 来编码它然后才进行传输。
- JSON_SORT_KEYS: 默认情况下 Flask 按照 JSON 对象的键的顺序来序来序列化它。这样做是为了确保键的顺序不会受到字典的哈希种子的影响,从而返回的值每次都是一致的,不会造成无用的额外 HTTP 缓存。你可以通过修改这个配置的值来覆盖默认的操作。但这是不被推荐的做法因为这个默认的行为可能会给你在性能的代价上带来改善。
- JSONIFY_PRETTYPRINT_REGULAR: 如果这个配置项被 True (默认值), 如果不是 XMLHttpRequest 请求的话(由 X-Requested-With 标头控制) json 字符串的返回值会被漂亮地打印出来。
从文件配置
理想情况下配置是存储在当前应用包之外,所以配置应该能从独立文件中获取:
1 | app=Flask(__name__) |
2 | app.config.from_object('yourapplication.default_settings') |
3 | app.config.from_envvar('YOURAPPLICATION_SETTINGS') |
from_object是从模块加载配置,from_envvar是从环境变量获取配置。
1 | export YOURAPPLICATION_SETTINGS=/PATH/TO/SETTINGS.CFG |
2 | python app.py |
配置文件也是py文件,只不过后缀不同罢了。
模块配置示例:
1 | class Config(object): |
2 | DEBUG=False |
3 | TESTING=False |
4 | DATABASE_URI='sqlite://:memory:' |
5 | class ProductionConfig(Config): |
6 | DATABASE_URI='mysql://user@localhost/foo' |
7 | class DevelopmentConfig(Config): |
8 | DEBUG=True |
9 | class TestingConfig(Config): |
10 | TESTING=True |
启用不同环境下的配置:
1 | app.config.from_object('configmodule.ProductConfig') |
实例文件夹
实例文件夹被为不使用版本控制和特定的部署而设计,这是放置运行时更改的文件和配置文件的最佳位置。
可以在创建Flask应用时显式地提供实例文件夹的路径,也可以让Flask自动找到它,显式配置:
1 | app=Flask(__name__,instance_path='/path/to/instance/folder') |
注意:情给出绝对路径,如果instance_path参数没有赋值,会使用下面默认的位置:
- 未安装的模块
1
/myapp.py
2
/instance
- 未安装的包
1
/myapp
2
/__init__.py
3
/instance
- 已安装的包或模块
1
$PREFIX/lib/python3.x/site-packages/myapp
2
$PREFIX/var/myapp-instance
既然配置对象提供从相对文件名载入配置的方式,那么我们也使得从相对实例路径的文件名加载成为可能,,配置文件中的相对路径的行为可以在“相对应用的根目录”(默认)和“相对实例文件夹”中切,换后者从通过构造函数的instance_relative_config开关实现:
1 | app=Flask(__name__,instance_instance_config=True) |
一个配置Flask来从模块预载入配置并覆盖配置文件夹中配置文件的完整例子:
1 | app=Flask(__name__,instance_relative_config=True) |
2 | app.config.from_object('yourapplication.default_settings') |
3 | app.config.from_pyfile('application.cfg',slient=True) |
实例文件的路径可以在Flask.instance_path找到,Flask也提供一个可以打开实例文件夹的捷径,就是Flask.open_instance_resource()。
1 | filename=os.path.join(app.instance_path,'application.cfg') |
2 | with open(filename) as f: |
3 | config=f.read() |
4 | |
5 | #or |
6 | with app.open_instance_resource('application.cfg') as f: |
7 | config=f.read() |