Flask config实践
Flask很赞的特点之一就是可扩展性强,非常灵活,对于config来说也是如此。Flask官方文档中已经提及了非常多的方法,以及一些有用的建议。我在Flask项目开发中的config实践,则是基于文档中提到的类继承方案,并通过环境变量来切换不同的config配置。 需求比较好的config方案是怎样的呢?我觉得有如下几点:
从这些需求点出发,下面分享一下我在Flask项目中的实践经验。 项目结构/project_root ????/config ????????__init__.py ????????default.py ????????development.py ????????development_sample.py ????????production.py ????????production_sample.py ????????testing.py ????/project ????????__init__.py ????????... 所有的配置文件都存放在
config类继承结构采用了基于类继承的config结构,保存默认配置的Config类作为基类,其他类继承之,如下: #?default.pyclass?Config(object): ????...#?development.pyclass?DevelopmentConfig(Config) ????...#?production.pyclass?ProductionConfig(Config) ????...#?testing.pyclass?TestingConfig(Config) ????... 这样做的好处首先在于,通过继承达到了config复用的目的。第二个好处来自IDE,比如PyCharm可以对类中属性是否为override进行提示,如下图: 有圈圈+向上箭头标志的行就是override自父类,没有的就是自己定义的啦,一目了然。 加载策略之前提到过,在
用代码表达就是: #?coding:?UTF-8import?osdef?load_config():
????"""加载配置类"""
????mode?=?os.environ.get('MODE')
????try:
????????if?mode?==?'PRODUCTION':
????????????from?.production?import?ProductionConfig
????????????return?ProductionConfig
????????elif?mode?==?'TESTING':
????????????from?.testing?import?TestingConfig
????????????return?TestingConfig
????????else:
????????????from?.development?import?DevelopmentConfig
????????????return?DevelopmentConfig
????except?ImportError,?e:
????????from?.default?import?Config
????????return?Config
加载config在定义好config结构之后,就可以加载了。需要尽早加载config,以便flask的一些第三方插件能够读取配置,比如Flask-SQLAlchemy: from?flask?import?Flaskfrom?config?import?load_config??#?绝对导入from?.models?import?dbdef?create_app():
????"""创建Flask?app"""
????app?=?Flask(__name__)
????#?Load?config
????config?=?load_config()
????app.config.from_object(config)
????db.init_app(app)
????...
使用configfrom?flask?import?current_appconfig?=?current_app.configSITE_DOMAIN?=?config.get('SITE_DOMAIN')
切换config通过改变环境变量 可以在代码中直接改变环境变量: import?osos.environ['MODE']?=?'TESTING'
在使用Fabric部署时,可以通过 from?fabric.api?import?shell_envwith?shell_env(MODE='PRODUCTION'):
????#?do?something
在使用Supervisor管理Gunicorn进程时,可以通过 [program:project_name] command?=?/var/www/project/venv/bin/gunicorn?-c?deploy/gunicorn.conf?wsgi:app directory?=?/var/www/project user?=?deploy autostart?=?true autorestart?=?true environment?=?MODE="PRODUCTION" 个人建议在生产服务器上默认启用 export?MODE=PRODUCTION
我的一个开源项目Flask-Boost已经用上了这种config策略,感兴趣的童鞋可以去看看。 参考文档/项目
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |