flask框架實(shí)戰(zhàn)--使用yaml配置文件

背景

眾所周知,flask框架非常輕量且靈活。項(xiàng)目中可能會碰很多配置項(xiàng)(如數(shù)據(jù)庫賬號、不同環(huán)境的URL域名、一些郵箱等配置),經(jīng)考量后,使用PyYAML模塊,將眾多配置放到統(tǒng)一的yaml配置文件中,來加載眾多配置,方便統(tǒng)一管理。

使用

何為YAML文件?

YAML是一種直觀的能夠被電腦識別的的數(shù)據(jù)序列化格式,容易被人類閱讀,并且容易和腳本語言交互。YAML類似于XML,JSON等,但是語法簡單得多,對于轉(zhuǎn)化成數(shù)組或可以hash的數(shù)據(jù)時(shí)是很簡單有效的。

YAML文件格式

# yaml格式
# 使用#號注釋
USER_CENTER_URL: "https://xx.example.com/ba037"
# 數(shù)據(jù)庫配置
ORDER_DATABASE_CONFIG: {
    "host": "172.21.0.9",
    "port": 3306,
    "user": "root",
    "passwd": "password",
    "db": "database_name"
  }
USER:
 - ID: 1
   NAME: "a"
 - ID: 2
   NAME: "b"

在python中,使用PyYAML解析后,以字典(dict)格式返回對象。然后按照字典方式取值即可,輸出如下:

{
   "USER_CENTER_URL":  "https://xx.example.com/ba037",
   "ORDER_DATABASE_CONFIG": {
    "host": "172.21.0.9",
    "port": 3306,
    "user": "root",
    "passwd": "password",
    "db": "database_name"
  },
  "USER": [{"ID": 1, "name": "a"}, {"ID": 2, "NAME": "b"}]
}

PyYAML安裝

預(yù)知環(huán)境:

  • python3
  • 已安裝flask模塊

這里我們直接使用pip來安裝即可。

[root@VM_122_122_centos ~]# pip install PyYAML

PyYAML使用

安裝完成之后,我們在flask框架中的app.py中編寫讀取yaml文件函數(shù):

# 導(dǎo)入yaml 文件
import yaml
# 讀取yaml文件函數(shù)(path為yaml文件路徑)
def read_yaml(path):
    with open(path, 'rb') as f:
        cf= f.read()
    cf = yaml.load(cf)
return cf

使flask加載yaml中的配置:

from flask import Flask
app = Flask(__name__)
cf = read_yaml("config.yaml")
app.config.update(cf)

完整app.py代碼:

from flask import Flask
from flask_restful import Api
import importlib
import sys
import os
import logging
import yaml
importlib.reload(sys)
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..'))


def create_app():
    app = Flask(__name__)
    # log初始化
    handler = logging.FileHandler(filename='log/flask.log', encoding='utf-8')
    handler.setLevel("DEBUG")
    format_ = "%(asctime)s[%(name)s][%(levelname)s] :%(levelno)s: %(message)s"
    formatter = logging.Formatter(format_)
    handler.setFormatter(formatter)
    app.logger.addHandler(handler)
    return app


def read_yaml(path):
    with open(path, 'rb') as f:
        cf = yaml.safe_load(f.read())
    return cf


app = create_app()
api = Api(app)
app.debug = True
cf = read_yaml("conf.yaml")
app.config.update(cf)

在flask項(xiàng)目各個(gè)模塊中使用yaml配置

比如要在數(shù)據(jù)庫連接模塊使用yaml中的配置。
我們需要從flask導(dǎo)入current_app,演示如下:

# coding=utf-8
import pymysql
from flask import current_app


class DataBaseQa(object):

    def __init__(self):
        #這里獲取到y(tǒng)aml中的配置
        db_config = current_app.config['QA_DATABASE_CONFIG']
        db = pymysql.Connect(**db_config)
        self.cursor = db.cursor()

    def query_user_openid(self, userid):
        sql = 'select * from user.users where userid={}'.format(userid)
        self.cursor.execute(sql)
        res = self.cursor.fetchone()
        return res

其他模塊,同樣導(dǎo)入current_app,然后使用current_app.config[]讀取配置即可。有關(guān)flask框架的current_app詳細(xì)介紹,以后更新。(可理解為flask的應(yīng)用實(shí)例對象)

總結(jié)

flask項(xiàng)目中使用yaml的好處:

  • yaml編寫簡單
  • 維護(hù)與修改配置文件容易
  • 更快速的進(jìn)行環(huán)境的切換(比如創(chuàng)建測試環(huán)境和開發(fā)環(huán)境兩套yaml配置,在flask啟動(dòng)是讀取不同環(huán)境配置即可切換)

參考文章:
https://blog.csdn.net/qq_22034353/article/details/88591681

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容