Flask config方法
来源:互联网 发布:安恒数据库审计系统 编辑:程序博客网 时间:2024/06/04 18:22
Flask很赞的特点之一就是可扩展性强,非常灵活,对于config来说也是如此。Flask官方文档中已经提及了非常多的方法,以及一些有用的建议。我在Flask项目开发中的config实践,则是基于文档中提到的类继承方案,并通过环境变量来切换不同的config配置。
需求
比较好的config方案是怎样的呢?我觉得有如下几点:
- 针对不同的环境分离配置(Development、Production等)
- 能够方便地在不同配置之间切换
- 适用于多人协作
- 易于维护
从这些需求点出发,下面分享一下我在Flask项目中的实践经验。
项目结构
/project_root /config __init__.py default.py development.py development_sample.py production.py production_sample.py testing.py /project __init__.py ...
所有的配置文件都存放在config
包中,而Flask app则位于project
包。对config
包中不同文件的做简单的说明:
__init__.py
:在这里定义加载配置的函数default.py
:默认配置development.py
(不签入Git):用于开发的config,每个开发人员的development config可以自定义development_sample.py
:development.py
的模板,每当有新成员加入dev团队时,只需将其另存为development.py
,然后根据自己的情况填充对应项即可production.py
(不签入Git):用于生产服务器的config,最好是由专人来管理production.py,其他dev需要在服务器增加config项,一律向此人申请production_sample.py
:production.py
的模板,填好后可以scp到服务器端testing.py
:用于测试的配置,测试的config应该是环境无关的(比如一般会使用sqlite数据库进行测试,这样就无需配置账号密码了),所以需要签入Git中
config类继承结构
采用了基于类继承的config结构,保存默认配置的Config类作为基类,其他类继承之,如下:
# default.pyclass Config(object): ...# development.pyclass DevelopmentConfig(Config) ...# production.pyclass ProductionConfig(Config) ...# testing.pyclass TestingConfig(Config) ...
这样做的好处首先在于,通过继承达到了config复用的目的。第二个好处来自IDE,比如PyCharm可以对类中属性是否为override进行提示,如下图:
有圈圈+向上箭头标志的行就是override自父类,没有的就是自己定义的啦,一目了然。
加载策略
之前提到过,在config/__init__.py
中会定义用于加载config的函数,加载策略如下:
- 读取环境变量
MODE
,根据MODE
的取值加载不同的config - 若
MODE
环境变量不存在(或不合法),则默认加载development config - 若development config无法导入,则使用default config
用代码表达就是:
# 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) ...
使用config
from flask import current_appconfig = current_app.configSITE_DOMAIN = config.get('SITE_DOMAIN')
切换config
通过改变环境变量MODE
来切换config,在不同应用场景下有不同的方法:
可以在代码中直接改变环境变量:
import osos.environ['MODE'] = 'TESTING'
在使用Fabric部署时,可以通过shell_env
设置环境变量
from fabric.api import shell_envwith shell_env(MODE='PRODUCTION'): # do something
在使用Supervisor管理Gunicorn进程时,可以通过environment
配置项来设置环境变量:
[program:project_name]command = /var/www/project/venv/bin/gunicorn -c deploy/gunicorn.conf wsgi:appdirectory = /var/www/projectuser = deployautostart = trueautorestart = trueenvironment = MODE="PRODUCTION"
0 0
- Flask config方法
- flask web中app.config.from_data方法原理介绍
- Flask 配置文件config之from_object 篇
- python flask中config配置管理问题
- Flask方法知识点收集
- flask关于请求方法
- flask 后台程序执行方法
- Flask SQLAlchemy 脚本测试方法
- Flask报错处理方法
- web.config常用方法
- flask
- flask
- Flask
- Flask
- flask
- flask
- Flask
- Flask
- 滑动插件scroll.js
- json数据如何存入到cookie中,如何获取
- Codeforces Round #371 (Div. 1) C. Sonya and Problem Wihtout a Legend(贪心+DP)
- 无废话WCF入门教程六[一个简单的Demo]
- java读取文件后修改,并写入到另一个文件
- Flask config方法
- 问题
- MPU6050姿态融合(转载)
- 一段监控cli模式下运行php十分正常运行的shell脚本
- systrace使用方式
- cos在Struts2上传文件IO报错及其解决方案
- Node.js开发的WeMall 6.0正式发布
- CodeForces 358A - Dima and Continuous Line(模拟)
- Android GrildView实现每一项等高宽,铺满屏幕