flask 使用红图拆分视图

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/weixin_38125866/article/details/82748627