目标:使用红图的route方法来代替蓝图的route方法。
1.创建视图函数,将视图函数注册到红图中
api = Redprint("user")
@api.route("/get")
def get_user():
return "视图函数"
2.将自定义的红图注册到蓝图中
def create_blueprint_v1():
bp_v1 = Blueprint("/v1", __name__)
book.api.register(bp_v1)
user.api.register(bp_v1)
return bp_v1
3.将蓝图注册到flask 核心app中
def register_my_blueprint(app):
from app.api.v1 import create_blueprint_v1
app.register_blueprint(create_blueprint_v1(), url_prefix="/v1")
4.创建flask对象,并将蓝图写入app中
def create_app():
app = Flask(__name__)
register_my_blueprint(app)
return app
5.由于红图是自己定义的,所以红图的相关方法需要自己去构建,可以参照蓝图的相关方法来进行创建,需要自己写的方法包括如下几个:
(1)route【第一步中的route路由方法】
(2)register【第二步中的register注册方法】
6.创建方法先去查看蓝图的route方法,蓝图的route方法如下:
def route(self, rule, **options):
def decorator(f):
endpoint = options.pop("endpoint", f.__name__)
self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator
7,仿照着书写我们的方法:
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 = options.pop("endpoint", f.__name__)
bp.add_url_rule(url_prefix + rule, endpoint, f, **options)
注:从蓝图的方法中,可以看出,蓝图可以直接调用它自己的对象,然后使用add_url_rule方法,将传入的数据直接保存在了自己的对象中,但是我们的route方法没有传入蓝图对象,也就无法调用add_url_rule来保存相关参数,所以,我们就先将传入的参数保存使用列表保存下来。并且,因为我们不可能只有一个视图函数,所以为了区分,我们将一个视图函数的rule,f,option用元组封装然后再存入列表中,等到其他方法中有对象时,我们再来遍历将视图参数传入对象中进行保存。
恰好,在register方法中,我们传入了一个bp的蓝图对象,现在就可以直接再次将之前存放在列表中的视图参数通过add_url_rule进行保存。