config.py
与app文件夹同级,使用层次结构的配置类
代码内容实例如下
import os
class Config: ##config子类
DEBUG = False
TESTING = False
@staticmethod
def init_app(app):
pass
class ProductionConfig(Config):#继承config基类
#产品中实际使用的config模块
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://%s:%s@%s/%s?charset=utf8' % (MysqlUser, MysqlPass, MysqlHost, MysqlDB)
SECRET_KEY = 'This is my key'
SQLALCHEMY_TRACK_MODIFICATIONS = True
UPLOAD_FOLDER = os.path.join(os.path.dirname(__file__), 'main/media')
UPLOADED_PHOTOS_DEST = os.path.join(os.path.dirname(__file__), 'main/media/images')
class DevelopmentConfig(Config):
##开发人员使用的Config
DEBUG = True
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://%s:%s@%s/%s?charset=utf8mb4' % (MysqlUser, MysqlPass, MysqlHost, MysqlDB)
SECRET_KEY = 'This is my key'
SQLALCHEMY_TRACK_MODIFICATIONS = True
class TestingConfig(Config):
#用于测试的config类
TESTING = True
config = {
'development': DevelopmentConfig,
'testing': TestingConfig,
'production': ProductionConfig,
'default': DevelopmentConfig
}
通过内置的字典访问不同的类
关于app /create_app 与config之间的关系
在manage.py 中我们可以看到
app = create_app('default')
create_app函数是这样定义的
from config import config
def create_app(config_name):
app = Flask(__name__)
CORS(app, supports_credentials=True)
app.config.from_object(config[config_name])
config[config_name].init_app(app)
···
return app
在这段函数中我们可以看出来
app.config.from_object(config[config_name])
config[config_name].init_app(app)
这段代码,相当于把上面我们提到的这个
config = {
'development': DevelopmentConfig,
'testing': TestingConfig,
'production': ProductionConfig,
'default': DevelopmentConfig
}
中的default,添加到了app的上下文中,使得app(main)中的任何一个文件都可以不使用绝对路径,通过
import config来直接导入配置选项
这就是为什么我在后期import的时候不需要..config的原因
为什么我们这么麻烦的专门建立一个Config.py文件来把所有的常量写入到这里呢?
原因如下
1.安全性考虑:再多人团队协作中,仓库都是相互公开的,我们在代码的时候,如果直接把包含敏感信息的代码写在工作区的话,很容易造成信息的泄露,比如说MYSQLUESER PASSWORD等,还有用户的邮箱个人信息等等,统一放在一个config中进行维护,将这些敏感信息放在电脑中,在通过os模块来引用,可以大大提高安全性,不会让你的密码在代码中裸奔。
2.方便性:各种常量分开散布在各个模块的各个文件当中,需要修改的时候,需要找到含有大量工程代码的文件中进行修改,维护起来费时费力,不如把所有常量都保存在一个文件中,便于维护和修改
3.团队协作中,每个人的本地数据库的账号密码都不一样,服务器上的也不一样,所以,每个人的config也都不一样,push的时候可以跳过config模块,这样每个人pull下来的代码不包含config.py,这样就不用每次pull的时候都修改一次数据库密码了。
4.可读性高。