flask中的配置文件是一个flask.config.Config对象(继承字典),默认配置如下

  1. {
  2. 'DEBUG': get_debug_flag(default=False), # 是否开启Debug模式
  3. 'TESTING': False, # 是否开启测试模式
  4. 'PROPAGATE_EXCEPTIONS': None,
  5. 'PRESERVE_CONTEXT_ON_EXCEPTION': None,
  6. 'SECRET_KEY': None,
  7. 'PERMANENT_SESSION_LIFETIME': timedelta(days=31),
  8. 'USE_X_SENDFILE': False,
  9. 'LOGGER_NAME': None,
  10. 'LOGGER_HANDLER_POLICY': 'always',
  11. 'SERVER_NAME': None,
  12. 'APPLICATION_ROOT': None,
  13. 'SESSION_COOKIE_NAME': 'session',
  14. 'SESSION_COOKIE_DOMAIN': None,
  15. 'SESSION_COOKIE_PATH': None,
  16. 'SESSION_COOKIE_HTTPONLY': True,
  17. 'SESSION_COOKIE_SECURE': False,
  18. 'SESSION_REFRESH_EACH_REQUEST': True,
  19. 'MAX_CONTENT_LENGTH': None,
  20. 'SEND_FILE_MAX_AGE_DEFAULT': timedelta(hours=12),
  21. 'TRAP_BAD_REQUEST_ERRORS': False,
  22. 'TRAP_HTTP_EXCEPTIONS': False,
  23. 'EXPLAIN_TEMPLATE_LOADING': False,
  24. 'PREFERRED_URL_SCHEME': 'http',
  25. 'JSON_AS_ASCII': True,
  26. 'JSON_SORT_KEYS': True,
  27. 'JSONIFY_PRETTYPRINT_REGULAR': True,
  28. 'JSONIFY_MIMETYPE': 'application/json',
  29. 'TEMPLATES_AUTO_RELOAD': None,
  30. }
DEBUG 启用/禁用调试模式
TESTING 启用/禁用测试模式
PROPAGATE_EXCEPTIONS 显式地允许或禁用异常的传播。如果没有设置或显式地设置为 None ,当 TESTING 或 DEBUG 为真时,这个值隐式地为 true.
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对象控制长期会话的生存时间。从 Flask 0.8 开始,也可以用整数来表示秒。
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() (默认的静态文件处理器)中使用。对于单个文件分别在 FlaskBlueprint 上使用 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 字符串的返回值会被漂亮地打印出来。

配置的修改方式总结

配置文件注意点

  • settings.py文件默认路径要放在程序root_path目录,如果instance_relative_config为True,则使用自定义instance_path 指定目录(Flask对象init方法的参数)
  • 默认配置 - 图1

字典形式

由于Config对象的本质是flask.config.Config对象(继承字典),可以使用字典相关的方式进行修改等操作。

  1. app.config['DEBUG'] = True
  2. # 注意!!少数属性支持.方式字典操作,更多的支持上方的字典操作。
  3. app.debug = True
  4. # 使用 dict.update() 方法来一次性更新多个键
  5. app.config.update(
  6. DEBUG=True,
  7. SECRET_KEY='...'
  8. )

文件形式 - from_pyfile

  1. # 通过py文件配置
  2. app.config.from_pyfile("python文件名称")
  3. # 注意!!只需要配置名称,无需填入文件路径
  4. app.config.from_pyfile('yourapplication.default_settings')
  5. # settings.py
  6. DEBUG = True
  7. '''
  8. 首先从 yourapplication.default_settings 模块加载配置
  9. 然后用 YOURAPPLICATION_SETTINGS 环境变量指向的文件的内容覆盖其值。
  10. 在 Linux 或 OS X 上,这个环境变量可以在服务器启动之前 ,在 shell 中用 export 命令设置:
  11. $ export YOURAPPLICATION_SETTINGS=/path/to/settings.cfg
  12. $ python run-app.py
  13. * Running on http://127.0.0.1:5000/
  14. * Restarting with reloader...
  15. 在 Windows 下则使用其内置的 set 命令:
  16. >set YOURAPPLICATION_SETTINGS=\path\to\settings.cfg
  17. '''

对象形式 - from_object

  1. app = Flask(__name__)
  2. app.config.from_object("python类或类的路径")
  3. app.config.from_object('yourapplication.default_settings')
  4. '''
  5. settings.py
  6. '''
  7. class Config(object):
  8. DEBUG = False
  9. TESTING = False
  10. DATABASE_URI = 'sqlite://:memory:'
  11. # 继承基类的配置类,可以对需求环境进行配置。即,生成环境和测试环境,使用的类不同即可达成效果。
  12. class ProductionConfig(Config):
  13. DATABASE_URI = 'mysql://user@localhost/foo'
  14. class DevelopmentConfig(Config):
  15. DEBUG = True
  16. class TestingConfig(Config):
  17. TESTING = True

环境变量形式 - from_envvar

  1. v# 通过环境变量配置
  2. app.config.from_envvar("环境变量名称")
  3. # 等同于 app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS'])
  4. # 环境变量的值为python文件名称名称,内部调用from_pyfile方法
  5. '''
  6. 注意!!!必须保证sys.path路径存在。
  7. '''

json文件形式 - from_json

  1. app.config.from_json("json文件名称")
  2. # JSON文件名称,必须是json格式,因为内部会执行json.loads

字典函数形式 - from_mapping

  1. app.config.from_mapping({'DEBUG': True})

实例文件夹 - instance_path - 放置运行时更改的文件和配置文件的最佳位置

Flask 0.8 引入了示例文件夹。 Flask 在很长时间使得直接引用相对应用文件夹的路径成为可能(通过 Flask.root_path )。这也是许多开发者加载存储在载入应用旁边的配置的方法。不幸的是,这只会在应用不是包,即根路径指向包内容的情况下才能工作。

在 Flask 0.8 中,引入了 Flask.instance_path 并提出了“实例文件夹” 的新概念。实例文件夹被为不使用版本控制和特定的部署而设计。这是放置运行时更改的文件和配置文件的最佳位置。

你可以在创建 Flask 应用时显式地提供实例文件夹的路径,也可以让 Flask 自动找到它。

  1. # 创建实例时显式配置instance_path
  2. app = Flask(__name__, instance_path='/path/to/instance/folder')

实例文件夹的默认位置配置

默认配置 - 图2

instance_relative_config=True 使用 instance_path 指定路径

  1. app = Flask(__name__, instance_relative_config=True)
  2. # 配置 Flask 来从模块预载入配置并覆盖配置文件夹中配置文件(如果存在)
  3. app = Flask(__name__, instance_relative_config=True)
  4. app.config.from_object('yourapplication.default_settings')
  5. app.config.from_pyfile('application.cfg', silent=True)

open_instance_resource() 打开实例文件夹中文件的路径

  1. # app.instance_path 获取实例文件夹的路径
  2. filename = os.path.join(app.instance_path, 'application.cfg')
  3. with open(filename) as f:
  4. config = f.read()
  5. # open_instance_resource 打开实例文件夹内文件
  6. # or via open_instance_resource:
  7. with app.open_instance_resource('application.cfg') as f:
  8. config = f.read()