|
tips:
- 介紹如何有效的統(tǒng)一注冊藍圖及自定義MethodView
- 本文基于python3編寫
- 代碼倉庫
目的
在項目開發(fā)中,通常采用工程模式來創(chuàng)建app,如果注冊接口寫在工廠函數(shù)中,不僅不好管理,而且代碼也看起來很臃腫。并且項目中會有很多模塊,每個模塊又有不同的功能,由此分割出來的接口也非常多。所有需要有統(tǒng)一的地方來管理接口及相關模塊。
解決方法
-
編寫藍圖(user.py)
from flask import Blueprint
bp = Blueprint("test", __name__, url_prefix='/')
@bp.route('/testBP', methods=["GET"])
def test_bp():
return "藍圖測試"
-
編寫自定義MethodView(auth.py)
from flask.views import MethodView
class AuthMethodView(MethodView):
# 指定需要啟用的請求方法
__methods__ = ["GET", "POST", "PUT"]
def get(self):
return "測試自定義MethodView"
def post(self):
return "測試自定義MethodView"
def put(self):
return "測試自定義MethodView"
def delete(self):
return "測試自定義MethodView"
-
統(tǒng)一管理藍圖和自定義MethodView(router.py)
from user import bp as user_bp
from auth import AuthMethodView
router = [
user_bp, # 用戶藍圖接口
AuthMethodView, # 權限自定義MethodView
]
-
統(tǒng)一注冊藍圖和自定義MethodView(app.py)
from flask import Flask, Blueprint
from router import router
def create_app():
"""
工廠模式創(chuàng)建APP
"""
app = Flask(__name__)
# 注冊接口
register_api(app, router)
return app
def register_api(app, routers):
"""
注冊藍圖和自定義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默認為類名小寫
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()
-
測試,啟動app
總結
- 統(tǒng)一管理了藍圖和自定義的MethodView,并減少了代碼的冗余,保持代碼的整潔性。
- 下一篇將介紹使用flask輸出excel報表
|