任何一個好的程序,配置文件必不可少,而且非常重要。配置文件里存儲了連接數據庫,redis的用戶密碼,不允許有任何閃失。要有靈活性,用戶可以自己配置;生產環境和開發環境要分開,最好能簡單的修改一個東西,就能達到要求;要有安全性,最好的方式,即使有一天前端服務器被竊取信息,配置文件里的信息也不能泄露。
python本身帶有configparser庫,可以解析普通文件的配置,但是這樣不但繁瑣,而且安全性也得不到保證。我在前面一再強調,能達到自己要求的實現方式,就是最好的方式。flask官方例子有一個非常好的事例,就是config文件本身就是一個py文件,直接導入,代碼簡單、實用。連接我們之前的代碼,我寫了如下配置文件。
config.py
class Config(object): SECRET_KEY = 'saduhsuaihfe332r32rfo43rtn3noiYUG9jijoNF23' QINIU_ACCESS_KEY = 'hP7WNic×××××××××××××××××××××××××oZfrVs6' QINIU_SECRET_KEY = 'bBZ×××××××××××××××××××××××××××××××××VAV' BUCKET_NAME = 'dameinv' class DevelopmentConfig(Config): DEBUG = True REDIS_HOST = 'localhost' REDIS_PORT = 6380 REDIS_DB = 4 REDIS_PASSWORD = '××××××' MYSQL_INFO = "mysql://root:××××××××@127.0.0.1:3306/blog01?charset=utf8" class ProductionConfig(Config): DEBUG = False REDIS_HOST = 'server-ip' REDIS_PORT = 6380 REDIS_DB = 4 REDIS_PASSWORD = '×××××××××××' MYSQL_INFO = "mysql://××××××××××@server-ip:3306/blog01?charset=utf8"
Conf = DevelopmentConfig
整個過程非常簡單,就3個類,基類是Config,這里面記載的配置信息,都各種開發環境公用的。如果有配置不公用,就把具體的配置信息放到子類中去,我們只需要引用具體的子類即可,每次從開發環境轉移到生產環境時,只需要修改Conf參數就可以了。
下面在view和model里面使用一下吧。
首先在view.py里面,把定義的那部分代碼修改如下:
from config import Conf app = Flask(__name__) app.config.from_object(Conf) app.secret_key = app.config['SECRET_KEY'] app.redis = redis.Redis(host=app.config['REDIS_HOST'], port=app.config['REDIS_PORT'], db=app.config['REDIS_DB'], password=app.config['REDIS_PASSWORD']) app.q = Auth(access_key=app.config['QINIU_ACCESS_KEY'], secret_key=app.config['QINIU_SECRET_KEY']) bucket_name = app.config['BUCKET_NAME']
×××××××××××××××
@app.route('/user')
@login_check
def user():
user = g.current_user
nickname = app.redis.hget('user:%s' % user.phone_number, 'nickname')
return jsonify({'code': 1, 'nickname': nickname, 'phone_number': user.phone_number})
××××××××××××××××××
if __name__ == '__main__':
app.run(debug=app.config['DEBUG'], host='0.0.0.0', port=5001)
其他代碼就省略了,跟之前版本一樣,只是讓大家看到效果不同,每個東西,都可以在配置文件里進行修改。從開發環境轉到生產環境,只需要在config.py文件里修改一下即可。是不是非常簡單?
同理,model.py也一樣
from config import Conf engine = create_engine(Conf.MYSQL_INFO, pool_recycle=7200)
model里面,沒有使用app環境來config,大家一定要記住,程序是寫的,怎么簡單,怎么寫,只要不影響效率,千萬不要被框架限定死。
好了,上面顯示了,怎么用config.py文件來做配置文件,基本使用會了,但是上面所說的安全性呢?如果哪天前端服務器的密碼被別人知道了,或者網站有重大漏洞,被別人看到config.py文件,他豈不是知道所有數據庫和redis的信息?那怎么做呢?其實也很簡單,直接引用config.pyc文件即可,上傳正式服務器的時候,把config.py文件給移除出去。是不是很傻瓜?沒關系,像我之前所說的那樣,如果能用最簡單的辦法達到目的,我為何還要走彎路呢?當然,還是擋不住高手的,他們可以反編譯pyc文件,這個就不要鑽牛角尖了。
整個配置文件是不是很簡單,這一章就講到這,下一章,我們講講flask restful api最最精華的一部分,藍圖。