版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38125866/article/details/82748627
蓝图
- 官方文档中蓝图的叙述:蓝图 是一种组织一组相关视图及其他代码的方式。与把视图及其他 代码直接注册到应用的方式不同,蓝图方式是把它们注册到蓝图,然后在工厂函数中 把蓝图注册到应用。
- 先看下是如何注册到蓝图,然后将蓝图注册到应用的。
from flask import Flask
from flask import Blueprint
app = Flask(__name__)
#这里创建了一个蓝图对象
admin = Blueprint('admin',__name__) #admin表示蓝图的名称,而__name__表示所在的模块。
#将视图注册到了蓝图
@admin.route('/',methods=['GET'])
def admin():
return 'admin'
#将蓝图注册到应用
app.register_blueprint(admin,url_prefix='/admin')
红图
- 从上面蓝图代码可以看出,先将视图注册到蓝图,然后再将蓝图注册到应用。蓝图虽然可以拆分视图,但是项目比较大,模块众多,路由管理起来不好处理。
- 下面看张图:
- 根据蓝图的处理方式,可以模仿它实现一个红图。首先将视图注册到红图,然后将红图注册到蓝图。然后将蓝图注册到应用。可以实现视图的热插拔。
- 只涉及route和register,可以仿照蓝图的实现写一个红图。
蓝图通过一个装饰器实现route,对路由进行注册。
def route(self, rule, **options):
def decorator(f):
# endpoint 默认为视图函数名# endpoint 默认为视图函数名
endpoint = options.pop("endpoint", f.__name__)
# 注册视图函数
self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator
#蓝图register的实现
def register(self, bp, url_prefix=None):
#这里对url进行处理,不传参数,默认使用name
if url_prefix is None:
url_prefix = '/'+self.nameurl_prefix = '/'+self.name
for f, rule, options in self.mound:
endpoint = options.pop("endpoint", f.__name__)endpoint = options.pop("endpoint", f.__name__)
bp.add_url_rule(url_prefix + rule, endpoint, f, **options)bp.add_url_rule(url_prefix + rule, endpoint, f, **options)
模仿蓝图的实现方式,可以实现一个红图。
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 = self.__name + '+' + options.pop("endpoint", f.__name__)
#注册视图到蓝图
bp.add_url_rule(url_prefix + rule, endpoint, f, **options)
- 如何使用呢,以及路由最终是怎样的。
from flask import Flask
app = Flask(__name__)
#实例化一个红图对像
rp = Redprint('login')
#将login视图注册到了红图rp
@api.route('',methods=['GET'])
def login():
return 'longin'
#实例化一个蓝图对象
bp = Blueprint('admin',__name__)
#将红图注册到蓝图中
rp.register(bp)
#将蓝图注册到app
app.register_blueprint(bp, url_prefix='/admin')
最终url: http://host/admin/login