配置管理

Flask 的设计思路是在应用开始时载入配置。你可以在代码中直接硬编码写入配置, 对于许多小应用来说这不一定是一件坏事,但是还有更好的方法。 不管你使用何种方式载入配置,都可以使用 Flask 对象的 config 属性来操作配置的值。 Flask 本身就使用这个对象 来保存一些配置,扩展也可以使用这个对象保存配置。同时这也是你保存配置的地方 ## config 实质上是一个字典的子类,可以像字典一样操作 一次更新多个配置值可以使用 dict.update() 方法: ``` app.config.update( TESTING=True, SECRET_KEY=b'_5#y2L"F4Q8z\n\xec]/' ) ``` # 环境和调试特征 ENV 和 DEBUG 配置值是特殊的,因为它们如果在应用设置完成之 后改变,那么可以会有不同的行为表现。为了重可靠的设置环境和调试, Flask 使 用环境变量。 把 FLASK_ENV 设置为 development 可以打开调试模式。 在调试模式下, flask run 会缺省使用交互调试器和重载器。如果需要脱离 环境,单独控制调试模式,请使用 FLASK_DEBUG 标示。 # 使用配置文件 如果把配置放在一个单独的文件中会更有用。理想情况下配置文件应当放在应用包之 外。这样可以使用不同的工具进行打包与分发( 使用 Setuptools 部署 ), 而后修改配置文件也没有影响。 因此,常见用法如下: app = Flask(__name__) app.config.from_object('yourapplication.default_settings') app.config.from_envvar('YOURAPPLICATION_SETTINGS') ### 配置文件本身实质是 Python 文件。只有全部是大写字母的变量才会被配置对象所使 用。 # 使用环境变量来配置 除了使用环境变量指向配置文件之外,你可能会发现直接从环境中控制配置值很有用 (或必要)。 启动服务器之前,可以在 Linux 或 OS X 上使用 shell 中的export命令设置环境变 量: $ export SECRET_KEY='5f352379324c22463451387a0aec5d2f' $ export MAIL_ENABLED=false $ python run-app.py * Running on http://127.0.0.1:5000/ **在 Windows 系统中使用内置的 set 来代替:** 一个有趣的方案是使用类和类的继承来配置: ``` 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 ``` **如果要使用这样的方案,那么必须使用 from_object():** ```python app.config.from_object('configmodule.ProductionConfig') ``` 注意 from_object() 不会实例化类对象。如果要操作已经实 例化的类,比如读取一个属性,那么在调用 from_object() 之前应当先实例化这个类: ```python from configmodule import ProductionConfig app.config.from_object(ProductionConfig()) # Alternatively, import via string: from werkzeug.utils import import_string cfg = import_string('configmodule.ProductionConfig')() app.config.from_object(cfg) ``` 在你的配置类中,实例化配置对象时允许使用 @property ```python class Config(object): """Base config, uses staging database server.""" DEBUG = False TESTING = False DB_SERVER = '192.168.1.56' @property def DATABASE_URI(self): # Note: all caps return 'mysql://user@{}/foo'.format(self.DB_SERVER) class ProductionConfig(Config): """Uses production database server.""" DB_SERVER = '192.168.19.32' class DevelopmentConfig(Config): DB_SERVER = 'localhost' DEBUG = True class TestingConfig(Config): DB_SERVER = 'localhost' DEBUG = True DATABASE_URI = 'sqlite:///:memory:' ``` 配置的方法多种多样,由你定度。以下是一些好的建议: 在版本控制中保存一个缺省配置。要么在应用中使用这些缺省配置,要么先导入 缺省配置然后用你自己的配置文件来重载缺省配置。 使用一个环境变量来切换不同的配置。这样就可以在 Python 解释器外进行切换, 而根本不用改动代码,使开发和部署更方便,更快捷。如果你经常在不同的项目 间切换,那么你甚至可以创建代码来激活 virtualenv 并导出开发配置。 在生产应用中使用 fabric 之类的工具,向服务器分别传送代码和配置。更 多细节参见 使用 Fabric 部署 方案。