应用总是需要一定的配置的。根据应用环境不同,会需要不同的配置。比如开关 调试模式、设置密钥以及其他依赖于环境的东西。

Flask 的设计思路是在应用开始时载入配置。你可以在代码中直接硬编码写入配 置,对于许多小应用来说这不一定是一件坏事,但是还有更好的方法。

不管你使用何种方式载入配置,都可以使用 Flask 对象的 config 属性来操作配置的值。 Flask 本身就使用这个对 象来保存一些配置,扩展也可以使用这个对象保存配置。同时这也是你保存配置

配置入门

config 实质上是一个字典的子类,可以像字典一样操作:

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

某些配置值还转移到了 Flask 对象中,可以直接通过 Flask 来操作:

app.testing = True

一次更新多个配置值可以使用 dict.update() 方法:

app.config.update(
    TESTING=True,
    SECRET_KEY='192b9bdd22ab9ed4d12e236c78afcb9a393ec15f71bbf5dc987d54727823bcbf

DEBUG 是一个特殊的配置值,因为这个值如果在应用设置完成之后改变, 那么可能表现出不同的行为。为了获得可靠的调试模式,应当在 flask 命令 上使用 --debug 参数或者使用 flask run 命令。 flask run 命令 默认在调试模式下使用交互调试器和重载器。

$ flask --app hello run --debug

推荐使用参数。尽管可以在你的配置中或者代码中设置 DEBUG ,但是强 烈不推荐这样做。因为它们不能被 flask run 命令提前使用,并且一些系统 或扩展可能会根据前面的值来配置自己。

内置配置变量

以下配置变量由 Flask 内部使用:

DEBUG

是否开启调试模式。使用 flask run 启动开发服务器时,遇到未能处理 的异常时会显示一个交互调试器,并且当代码变动后服务器会重启。 debug 属性映射了这个配置键。这是由 FLASK_DEBUG 环境变量设置的,如果只是在代码中设置,那么可能会出

缺省值: False

TRAP_BAD_REQUEST_ERRORS

尝试操作一个请求字典中不存在的键,如 argsform ,会返回 一个 400 Bad Request error 页面。开启本变量,可以把这种错误作为一个 未处理的异常处理,这样就可以使用交互调试器了。本变量是一个特殊版本 的 TRAP_HTTP_EXCEPTIONS 。如果没有设置,本变量会在调试模式下开

缺省值: None

密钥应当是一个长的随机的 bytes 或者 str 。例如,复制下面的 输出到你的配置中:

$ python -c 'import secrets; print(secrets.token_hex())'
'192b9bdd22ab9ed4d12e236c78afcb9a393ec15f71bbf5dc987d54727823bcbf'

当发贴提问或者提交代码时,不要泄露密钥。

缺省值: None

SESSION_COOKIE_DOMAIN

会话 cookie 上的 Domain 参数值。如果不设置,浏览器将只把 cookie 发送到它所设定的确切域。否则,它们也会把它发送到给定值的任何

不设置这个值比设置它更有限制性和安全性。

缺省值: None

Changed in version 2.3: 默认情况下不设置,不会回落到 SERVER_NAME

SESSION_COOKIE_PATH

认可会话 cookie 的路径。如果没有设置本变量,那么路径为 APPLICATION_ROOT ,如果 APPLICATION_ROOT 也没有设置,那么会 是 /

缺省值: None

SESSION_COOKIE_SECURE

如果 cookie 标记为“ secure ”,那么浏览器只会使用基于 HTTPS 的请求 发送 cookie 。应用必须使用 HTTPS 服务来启用本变量。

缺省值: False

SESSION_COOKIE_SAMESITE

限制来自外部站点的请求如何发送 cookie 。可以被设置为 'Lax' (推 荐)或者 'Strict' 。参见 Set-Cookie 选项

缺省值: None

Changelog

New in version 1.0.

PERMANENT_SESSION_LIFETIME

如果 session.permanent 为真, cookie 的有效期为本变量设置的数字, 单位为秒。本变量可能是一个 datetime.timedelta 或者一个 int

Flask 的缺省 cookie 机制会验证电子签章不老于这个变量的值。

缺省值: timedelta(days=31)2678400 秒)

SESSION_REFRESH_EACH_REQUEST

session.permanent 为真时,控制是否每个响应都发送 cookie 。每 次都发送 cookie (缺省情况)可以有效地防止会话过期,但是会使用更多 会持续会话不受影响。

缺省值: True

USE_X_SENDFILE

当使用 Flask 提供文件服务时,设置 X-Sendfile 头部。有些网络服务 器,如 Apache ,识别这种头部,以利于更有效地提供数据服务。本变量只 有使用这种服务器时才有效。

缺省值: False

SEND_FILE_MAX_AGE_DEFAULT

当提供文件服务时,设置缓存控制最长存活期,以秒为单位。可以是一个 datetime.timedelta 或者一个 int 。在一个应用或者蓝图上 使用 get_send_file_max_age() 可以基于单个文件重 载本变量。

如果设置为 None ,那么 send_file 会告诉浏览器使用条件请求代 替一个计时缓存,这样做比较推荐。

缺省值: None

MAX_CONTENT_LENGTH

在进来的请求数据中读取的最大字节数。如果本变量没有配置,并且请求没 有指定 CONTENT_LENGTH ,那么为了安全原因,不会读任何数据。

缺省值: None

Changed in version 2.3: JSON_AS_ASCIIJSON_SORT_KEYSJSONIFY_MIMETYPEJSONIFY_PRETTYPRINT_REGULAR 被移除。默认的 app.json 提供了 相等的属性可以替代。

Changed in version 2.3: ENV 被移除。

Changelog

Changed in version 2.2: 移除 PRESERVE_CONTEXT_ON_EXCEPTION.

Changed in version 1.0: LOGGER_NAMELOGGER_HANDLER_POLICY 被删除。关于配置的更多 内容参见 日志

添加 ENV 来映射 FLASK_ENV 环境变量。

添加 SESSION_COOKIE_SAMESITE 来控制会话 cookie 的 SameSite 选项。

添加 MAX_COOKIE_SIZE 来控制来自于 Werkzeug 警告。

New in version 0.11: SESSION_REFRESH_EACH_REQUEST, TEMPLATES_AUTO_RELOAD, LOGGER_HANDLER_POLICY, EXPLAIN_TEMPLATE_LOADING

New in version 0.10: JSON_AS_ASCIIJSON_SORT_KEYSJSONIFY_PRETTYPRINT_REGULAR

New in version 0.9: PREFERRED_URL_SCHEME

New in version 0.8: TRAP_BAD_REQUEST_ERRORS, TRAP_HTTP_EXCEPTIONS, APPLICATION_ROOT, SESSION_COOKIE_DOMAIN, SESSION_COOKIE_PATH, SESSION_COOKIE_HTTPONLY, SESSION_COOKIE_SECURE

New in version 0.7: PROPAGATE_EXCEPTIONS, PRESERVE_CONTEXT_ON_EXCEPTION

New in version 0.6: MAX_CONTENT_LENGTH

New in version 0.5: SERVER_NAME

New in version 0.4: LOGGER_NAME

使用 Python 配置文件

如果把配置放在一个单独的文件中会更有用。理想情况下配置文件应当放在应用 包之外。你针对不同的部署使用特定的配置。

常见用法如下:

app = Flask(__name__)
app.config.from_object('yourapplication.default_settings')
app.config.from_envvar('YOURAPPLICATION_SETTINGS')

首先从 yourapplication.default_settings 模块载入配置,然后根据 YOURAPPLICATION_SETTINGS 环境变量所指向的文件的内容重载配置的 值。在启动服务器前,这个环境变量可以在终端中设置:

$ export YOURAPPLICATION_SETTINGS=/path/to/settings.cfg
$ flask run
 * Running on http://127.0.0.1:5000/