config.py
與app文件夾同級(jí),使用層次結(jié)構(gòu)的配置類
代碼內(nèi)容實(shí)例如下
import os
class Config: ##config子類
DEBUG = False
TESTING = False
@staticmethod
def init_app(app):
pass
class ProductionConfig(Config):#繼承config基類
#產(chǎn)品中實(shí)際使用的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):
##開發(fā)人員使用的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
}
通過內(nèi)置的字典訪問不同的類
關(guān)于app /create_app 與config之間的關(guān)系
在manage.py 中我們可以看到
app = create_app('default')
create_app函數(shù)是這樣定義的
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
在這段函數(shù)中我們可以看出來
app.config.from_object(config[config_name])
config[config_name].init_app(app)
這段代碼,相當(dāng)于把上面我們提到的這個(gè)
config = {
'development': DevelopmentConfig,
'testing': TestingConfig,
'production': ProductionConfig,
'default': DevelopmentConfig
}
中的default,添加到了app的上下文中,使得app(main)中的任何一個(gè)文件都可以不使用絕對(duì)路徑,通過
import config來直接導(dǎo)入配置選項(xiàng)
這就是為什么我在后期import的時(shí)候不需要..config的原因
為什么我們這么麻煩的專門建立一個(gè)Config.py文件來把所有的常量寫入到這里呢?
原因如下
1.安全性考慮:再多人團(tuán)隊(duì)協(xié)作中,倉庫都是相互公開的,我們?cè)诖a的時(shí)候,如果直接把包含敏感信息的代碼寫在工作區(qū)的話,很容易造成信息的泄露,比如說MYSQLUESER PASSWORD等,還有用戶的郵箱個(gè)人信息等等,統(tǒng)一放在一個(gè)config中進(jìn)行維護(hù),將這些敏感信息放在電腦中,在通過os模塊來引用,可以大大提高安全性,不會(huì)讓你的密碼在代碼中裸奔。
2.方便性:各種常量分開散布在各個(gè)模塊的各個(gè)文件當(dāng)中,需要修改的時(shí)候,需要找到含有大量工程代碼的文件中進(jìn)行修改,維護(hù)起來費(fèi)時(shí)費(fèi)力,不如把所有常量都保存在一個(gè)文件中,便于維護(hù)和修改
3.團(tuán)隊(duì)協(xié)作中,每個(gè)人的本地?cái)?shù)據(jù)庫的賬號(hào)密碼都不一樣,服務(wù)器上的也不一樣,所以,每個(gè)人的config也都不一樣,push的時(shí)候可以跳過config模塊,這樣每個(gè)人pull下來的代碼不包含config.py,這樣就不用每次pull的時(shí)候都修改一次數(shù)據(jù)庫密碼了。
4.可讀性高。