利用Python Flask藍(lán)圖加自定義藍(lán)圖劃分優(yōu)雅的目錄結(jié)構(gòu)
我們在用Flask開發(fā)網(wǎng)站的時候。經(jīng)??吹接泻芏嗳税阉械穆酚珊瘮?shù)放到了入口文件,這種做法是非常不可取的,如果我們的視圖函數(shù)有幾百個了都寫到一個文件里肯定是不行的。還有在實現(xiàn)中我們都在比較大型項目里面我們可能有十幾個甚至幾十個這種不同模型。我們需要考慮把這些模型分文別類歸屬到不同的文件中去。而不是都集中在同一個文件中。如下圖這種:
是不是很亂,那么我們怎么拆分這些函數(shù)了。接下來我們就來簡單實現(xiàn)一下:
一、 規(guī)劃目錄結(jié)構(gòu)
二、新建app包構(gòu)造核心目錄
api/v1/init.py 接口目錄為版本號模塊初始化文件
api/v1/user.py 接口目錄為版本號加上模塊名稱文件
config/settings.py 包為配置文件
lib/redprint.py核心類文件模仿藍(lán)圖重寫
app.py?核心入口文件
當(dāng)然還有其他包比如model為數(shù)據(jù)庫validate為驗證等等就不在列舉
api/v1/init.py 用藍(lán)圖托管版本號導(dǎo)入不同模塊
from?flask?import?Blueprint from?app.api.v1?import?user,?website def?create_blueprint_v1(): ????bp_v1?=?Blueprint('v1',?__name__) ????user.api.register(bp_v1) ????website.api.register(bp_v1) ????return?bp_v1
api/v1/user.py 用lib下自定義redprint托管模塊
from?app.lib.redprint?import?Redprint api?=?Redprint('user') @api.route('/get') def?get_user(): ????return?'get' @api.route('/create') def?create_user(): ????return?'create'
settings.py?一些數(shù)據(jù)庫等配置信息
TOKEN_EXPIRATION?=?30?*?24?*?3600 SQLALCHEMY_DATABASE_URI?=?\ ????'mysql+cymysql://root:123456@localhost/test' SECRET_KEY?=?'test'
redprint.py模仿藍(lán)圖重寫register和route方法
class?Redprint(object): ????def?__init__(self,?name): ????????self.name?=?name ????????self.mound?=?[] ????def?route(self,?rule,?**options): ????????def?decorator(f): ????????????self.mound.append((f,?rule,?options)) ????????????return?f ????????return?decorator ????def?register(self,?bp,?url_prefix=None): ????????if?url_prefix?is?None: ????????????url_prefix?=?'/'?+?self.name ????????for?f,?rule,?options?in?self.mound: ????????????endpoint?=?options.pop("endpoint",?f.__name__) ????????????bp.add_url_rule(url_prefix?+?rule,?endpoint,?f,?**options)
app.py?核心入口文件
from?flask?import?Flask def?register_blueprints(app): ????from?app.api.v1?import?create_blueprint_v1 ????app.register_blueprint(create_blueprint_v1(),?url_prefix='/v1') def?create_app(): ????app?=?Flask(__name__) ????app.config.from_object('app.config.settings') ????register_blueprints(app) ????return?app
三、main.py入口文件
from?app.app?import?create_app app?=?create_app() if?__name__?==?'__main__': ????app.run(debug=True,?host='0.0.0.0',?port=5001)
測試看一下效果: