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