tips:
- 介紹如何有效的統(tǒng)一注冊(cè)藍(lán)圖及自定義MethodView
- 本文基于python3編寫(xiě)
- 代碼倉(cāng)庫(kù)
目的
在項(xiàng)目開(kāi)發(fā)中,通常采用工程模式來(lái)創(chuàng)建app,如果注冊(cè)接口寫(xiě)在工廠函數(shù)中,不僅不好管理,而且代碼也看起來(lái)很臃腫。并且項(xiàng)目中會(huì)有很多模塊,每個(gè)模塊又有不同的功能,由此分割出來(lái)的接口也非常多。所有需要有統(tǒng)一的地方來(lái)管理接口及相關(guān)模塊。
解決方法
-
編寫(xiě)藍(lán)圖(user.py )
from flask import Blueprint
bp = Blueprint("test", __name__, url_prefix='/')
@bp.route('/testBP', methods=["GET"])
def test_bp():
return "藍(lán)圖測(cè)試"
-
編寫(xiě)自定義MethodView(auth.py )
from flask.views import MethodView
class AuthMethodView(MethodView):
# 指定需要啟用的請(qǐng)求方法
__methods__ = ["GET", "POST", "PUT"]
def get(self):
return "測(cè)試自定義MethodView"
def post(self):
return "測(cè)試自定義MethodView"
def put(self):
return "測(cè)試自定義MethodView"
def delete(self):
return "測(cè)試自定義MethodView"
-
統(tǒng)一管理藍(lán)圖和自定義MethodView(router.py )
from user import bp as user_bp
from auth import AuthMethodView
router = [
user_bp, # 用戶藍(lán)圖接口
AuthMethodView, # 權(quán)限自定義MethodView
]
-
統(tǒng)一注冊(cè)藍(lán)圖和自定義MethodView(app.py )
from flask import Flask, Blueprint
from router import router
def create_app():
"""
工廠模式創(chuàng)建APP
"""
app = Flask(__name__)
# 注冊(cè)接口
register_api(app, router)
return app
def register_api(app, routers):
"""
注冊(cè)藍(lán)圖和自定義MethodView
"""
for router in routers:
if isinstance(router, Blueprint):
app.register_blueprint(router)
else:
try:
endpoint = router.__name__
view_func = router.as_view(endpoint)
# url默認(rèn)為類名小寫(xiě)
url = '/{}/'.format(router.__name__.lower())
if 'GET' in router.__methods__:
app.add_url_rule(url, defaults={'key': None}, view_func=view_func, methods=['GET', ])
app.add_url_rule('{}<string:key>'.format(url), view_func=view_func, methods=['GET', ])
if 'POST' in router.__methods__:
app.add_url_rule(url, view_func=view_func, methods=['POST', ])
if 'PUT' in router.__methods__:
app.add_url_rule('{}<string:key>'.format(url), view_func=view_func, methods=['PUT', ])
if 'DELETE' in router.__methods__:
app.add_url_rule('{}<string:key>'.format(url), view_func=view_func, methods=['DELETE', ])
except Exception as e:
raise ValueError(e)
if __name__ == '__main__':
app = create_app()
app.run()
-
測(cè)試,啟動(dòng)app
總結(jié)
- 統(tǒng)一管理了藍(lán)圖和自定義的MethodView,并減少了代碼的冗余,保持代碼的整潔性。
- 下一篇將介紹使用flask輸出excel報(bào)表
|