- 如何理解flask中的blueprint的参数
- Flask之前后端分离restful api学习笔记(一)——Redprint
- Flask初探五( Blueprint / url_for / endpoint )
- Flask初探二( app.route 内部实现)
- flask蓝图的使用
项目结构:
app - libs - redprint.py
app - api - v1 - resident.py
app - api - v1 - __init__.py
app - __init__.py
红图的实现核心模拟蓝图的:
- route装饰器
- 注册函数register
区别在于,通过self.mound来储存对应参数,然后再到register中解包,这样便可以将对应参数传给bp,并调用add_url_rule方法
-
文件地址: app - libs - redprint.py
class Redprint:
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
# 蓝图默认返回的endpoint名字格式是:self.name + f.__name__
# f.__name__ 是视图函数view_func的名字
# 但是为了能在scope权限控制哪里 可以通过传递模块的名字 以模块为单位 进行权限控制
# 而不是单独以视图函数名字为单位
# 改为红图 加 视图函数的形式 v1.red_name+view_func
# v1.view_func ===> v1.red_name+view_func
endpoint = self.name + '+' + \
options.pop("endpoint", f.__name__)
bp.add_url_rule(url_prefix + rule, endpoint, f, **options)
- 文件地址: app - api - v1 - resident.py
from app.libs.redprint import Redprint
api = Redprint('resident') # 视图层注册红图
- 文件地址: app - api - v1 - init.py
from flask import Blueprint
from app.api.v1 import resident
...
def create_blueprint_v1():
bp_v1 = Blueprint('v1',__name__)
resident.api.register(bp_v1)
...
return bp_v1
- 文件地址: app - init.py
# 注册
from .app 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.secure')
app.config.from_object('app.config.settings')
register_blueprints(app)
return app
网友评论