PythonWeb之Flask框架配置管理(一)(python web flask開發框架)

前言:

在學習Falsk框架的時候發現了網上資源比較繁雜,而涉及到工程項目的文件配置和管理也是各有千秋。所以花了點時間專門整理一個配置項目工程目錄的文章,本篇文章從最初始化最簡潔的Flask安裝樣例出發,從零開始編寫代碼和配置文件,旨在幫助本人以及廣大讀者理解項目目錄文件之間的關系。

那么接下來就讓我們進入到flask目錄配置的學習中。

首先這里我選擇pycharm進行開發,毋庸置疑,pycharm是最好最流行的python IDE,功能強大,方便實用。借助于使用virtualenv創建好的虛擬環境,開始創建一個新的python空項目(這里不選擇直接使用flask框架創建項目)。

PythonWeb之Flask框架配置管理(一)(python web flask開發框架)

創建好一個空項目后,由我們自己手動新建各部分所需文件目錄,并編寫原始代碼。在這之前,我們先來了解一下Flask程序的默認(初始)結構。

Flask框架默認(初始)項目結構

app.pyfrom flask import Flaskapp = Flask(__name__)?@app.route('/')def index(): return 'Hello Flask'??if __name__ == '__main__': app.run()

創建一個app.py 文件之后,寫下上面的代碼,點擊運行??梢缘玫揭韵陆缑?。

PythonWeb之Flask框架配置管理(一)(python web flask開發框架)

很顯然,程序運行成功了。

現在我們來編寫一些配置所需要的代碼。

1.在單一文件中構建所有依賴工具

manage.py

from flask import Flaskfrom flask_sqlalchemy import SQLAlchemyfrom flask_SESSION import Sessionfrom flask_wtf import CSRFProtect?import redis??app = Flask(__name__)??class BaseConfig(object): """配置信息""" DEBUG = True? SECRET_KEY = "sdsadafafsfsd@$%9"? # 數據庫 SQLALCHEMY_DATABASE_URL = "mysql://root:mysql@127.0.0.1:3306/database_name" SQLALCHEMY_TRACK_MODIFICATIONS = True? # redis REDIS_HOST = "127.0.0.1" REDIS_PORT = 6379? # flask_session 配置 SESSION_TYPE = "redis" SESSION_REDIS = redis.StrictRedis(host=REDIS_HOST,port=REDIS_PORT) # 若是上線運行,此處可能是另一臺redis服務器 session_USE_SIGNER = True # 對cookie中session_id 進行隱藏處理 SESSION_SESSION_LIFETIME = 86400 # session數據的有效期,單位 秒??app.config.from_object(Config)?# 數據庫db = SQLAlchemy(app)?# 創建redis連接對象redis_store = redis.StrictRedis(host=BaseConfig.REDIS_HOST,port=BaseConfig.REDIS_PORT)?# 利用flask-session,將session數據保存到redis中Session(app)?# 為flask補充csrf防護CSRFProtect(app)??@app.route('/')def index(): return 'Hello Flask'??if __name__ == '__main__': app.run()

2.(自定義)創建工程目錄

在實際生產中,我們將單一配置文件中的依賴工具和功能提取抽離出來,寫到不同的模塊中,便于代碼的管理和復用

2.1 第一次抽取

(1)第一次的抽取,先用工廠模式將app的創建抽離出來,并分匹配【配置模式】,將【配置模式】作為 類 來傳遞

config.py

# 所有的配置項都放到config.py中# flask的配置項目,名字都是大寫字母?import redis?class BaseConfig(object): DEBUG = True? # 秘鑰 SECRET_KEY = "sdsadafafsfsd@$%9"? # 數據庫 SQLALCHEMY_DATABASE_URL = "mysql://root:mysql@127.0.0.1:3306/database_name" SQLALCHEMY_TRACK_MODIFICATIONS = True? # redis REDIS_HOST = "127.0.0.1" REDIS_PORT = 6379? # flask_session 配置 SESSION_TYPE = "redis" SESSION_REDIS = redis.StrictRedis(host=REDIS_HOST,port=REDIS_PORT) # 若是上線運行,此處可能是另一臺redis服務器 SESSION_USE_SIGNER = True # 對cookie中session_id 進行隱藏處理 SESSION_SESSION_LIFETIME = 86400 # session數據的有效期,單位 秒??# 發行環境class ProductionConfig(BaseConfig): DEBUG = False??# 開發環境class DevelopmentConfig(BaseConfig): DEBUG = True??# 測試環境class TestingConfig(BaseConfig): pass??# 配置信息config_map = { 'develop': DevelopmentConfig, 'product': ProductionConfig, 'test': TestingConfig}

(2)第一次抽取后的manage.py 文件還剩下

manage.py

from flask import Flaskfrom flask_sqlalchemy import SQLAlchemyfrom flask_session import Sessionfrom flask_wtf import csrfProtectfrom config import config_map?import redis??# 工廠模式def create_app(config_name): """ 創建flask的應用對象 :param config_name: str 配置模式的 模式的名字 ("develop","product") :return: """ app = Flask(__name__)? # 獲取配置模式的名字,獲取配置參數的類 config_class = config_map.get(config_name) app.config.from_object(config_class)? return app??app = create_app('develop')?# 數據庫db = SQLAlchemy(app)?# 創建redis連接對象redis_store = redis.StrictRedis(host=Config.REDIS_HOST,port=Config.REDIS_PORT)?# 利用flask-session,將session數據保存到redis中Session(app)?# 為flask補充csrf防護CSRFProtect(app)??@app.route('/')def index(): return 'Hello Flask'??if __name__ == '__main__': app.run()

2.2 第二次抽取

(1)第二次抽取,首先在項目根目錄創建一個新的 文件夾app,在app文件夾下創建–init–.py、models.py、views.py文件。

PythonWeb之Flask框架配置管理(一)(python web flask開發框架)

(2)將工廠模式函數create_app復制到–init–.py文件,同時將 數據庫初始化/實例化 app應用程序的代碼抽離過來,如下:

PythonWeb之Flask框架配置管理(一)(python web flask開發框架)

(3)此時有一個問題,db = SQLAlchemy(app) 中 app還沒有被創建,當然我們可以導入manage模塊來解決這個問題,如下

import manage# 數據庫db = SQLAlchemy(manage.app)

但這樣很明顯就失去了一開始想要分隔抽離代碼功能的作用,所以這里采用以下方法解決:

先創建SQLAlchemy對象,但不進行賦值,而后在工廠函數中進行賦值。

——init——.py

from flask import Flaskfrom config import config_mapfrom flask_sqlalchemy import SQLAlchemy??# 數據庫 初始化關聯appdb = SQLAlchemy()??# 工廠模式def create_app(config_name): """ 創建flask的應用對象 :param config_name: str 配置模式的 模式的名字 ("develop","product") :return: """ app = Flask(__name__)? # 獲取配置模式的名字,獲取配置參數的類 config_class = config_map.get(config_name) app.config.from_object(config_class)? # db初始化關聯app過程 # 使用app初始化db db.init_app(app)? return app

manage.py

from flask_session import Sessionfrom flask_wtf import CSRFProtect?import redis?from app import create_app??app = create_app('develop')?# 創建redis連接對象redis_store = redis.StrictRedis(host=Config.REDIS_HOST,port=Config.REDIS_PORT)?# 利用flask-session,將session數據保存到redis中Session(app)?# 為flask補充csrf防護CSRFProtect(app)??@app.route('/')def index(): return 'Hello Flask'??if __name__ == '__main__': app.run()

2.3 第三次抽取

(1)這里將redis連接對象也抽取到–init–.py文件中,和上一個抽取中的db一樣,其他模塊中的代碼也會使用到redis,所以這里db、redis不能放在工廠函數中,否則會導致其他模塊導包是無法導入。

PythonWeb之Flask框架配置管理(一)(python web flask開發框架)

(2)設置全局變量redis_store = None,然后在工廠函數中再進行初始化。

PythonWeb之Flask框架配置管理(一)(python web flask開發框架)

2.4 第四次抽取

(1)第四次抽取,將session和csrf兩個功能同樣抽取到–init–.py文件中,因為session和csrf是Flask的補充功能,在程序執行中只需要初始化一次以修改 flask機制或引入該功能,初始化對象后,后續操作直接在視圖函數中使用flask自己的全局對象session和flask_wtf中csrf生成的內容就可以了,并不使用Session(app)、CSRFProtect(app)對象。

因此,將Session(app)、CSRFProtect(app)對象直接寫在工廠函數中,創建時初始化一次就可以了。

manage.py

from app import create_app??app = create_app('develop')???@app.route('/')def index(): return 'Hello Flask'??if __name__ == '__main__': app.run()

–init–.py

from flask import Flaskfrom config import config_mapfrom flask_sqlalchemy import SQLAlchemyfrom flask_session import Sessionfrom flask_wtf import CSRFProtect?import redis?# 數據庫 初始化關聯appdb = SQLAlchemy()?# 創建redis連接對象redis_store = None??# 工廠模式def create_app(config_name): """ 創建flask的應用對象 :param config_name: str 配置模式的 模式的名字 ("develop","product") :return: """ app = Flask(__name__)? # 獲取配置模式的名字,獲取配置參數的類 config_class = config_map.get(config_name) app.config.from_object(config_class)? # db初始化關聯app過程 db.init_app(app)? # 初始化redis工具 global redis_store redis_store = redis.StrictRedis(host=config_class.REDIS_HOST, port=config_class.REDIS_PORT)? # 利用flask-session,將session數據保存到redis中 Session(app)? # 為flask補充csrf防護 CSRFProtect(app)? return app

好了,到此將項目目錄文件的一些基本配置完成了。接下來需要引入Flask藍圖的概念,繼續進行代碼分離,以及一些需要修改的地方,且放到下一篇文章來講。

版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。

(0)
上一篇 2022年7月26日 下午5:06
下一篇 2022年7月26日 下午5:20

相關推薦

精品综合久久久久久888蜜芽| 91制片厂(果冻传媒)原档破解 | 国产一区二区在线视频| 视频二区三区国产情侣在线| 国产精品自产拍在线观看| 99在线精品免费视频九九视| 国产高清av在线播放| 七次郎在线视频观看精品| 女仆胸大又放荡的h| 久久久久久一品道精品免费看| 曰韩无码无遮挡a级毛片| 亚洲欧美日韩综合久久| 欧美国产激情二区三区| 亚洲国产精彩中文乱码av| 最新免费jlzzjlzz在线播放| 亚洲AV最新在线观看网址| 日本加勒比一区| 久久久婷婷五月亚洲97号色| 日韩av片无码一区二区三区不卡| 亚洲午夜精品国产电影在线观看| 明星ai人脸替换造梦在线播放| 亚洲啪啪免费视频| 日韩国产成人精品视频| 久久国产免费福利永久| 成人国产午夜在线视频| 一级一级女人真片| 国内精品18videosex性欧美| 7777奇米影视| 国产女人91精品嗷嗷嗷嗷| 美女被吸乳羞羞动漫| 国产中文字幕在线播放| 色爱区综合激情五月综合激情| 国产在线国偷精品免费看| 美女张开腿让男人桶国产| 午夜福利一区二区三区高清视频 | 国产成人精品免费直播| 黑色毛衣在线播放| 国产精品大尺度尺度视频| 99久久精品久久久久久清纯| 国产男女在线观看| 香蕉视频成人在线观看|