# 使用Blueprint注册视图函数
# from flask import Blueprint
# user = Blueprint('user',__name__)
# @user.route('/v1/user/get')
# def get_user():
# return 'imwl'
from app.libs.redprint import Redprint
api = Redprint('user')
@api.route('/get')
def get_user():
return 'get_user'
@api.route('/create')
def create_user():
return 'create_user'
2.2 红图向蓝图的注册
app/api/init.py
from flask import Blueprint
from app.api.v1 import user, book
# 创建一个Bluerint,把Redprint注册到Blueprint上,并传入Redprint一个前缀'/book
def create_blueprint_v1():
bp_v1 = Blueprint('v1', __name__)
# 假设api有register的方法,后面再实现, url_prefix解决前缀问题
# book.api.register(bp_v1, url_prefix='/book')
# user.api.register(bp_v1, url_prefix='/user') # 后文 有解释为什么不传 url_prefix
user.api.register(bp_v1)
book.api.register(bp_v1)
return bp_v1
from flask import Blueprint
from app.api.v1 import book, user
def create_blueprint_v1():
bp_v1 = Blueprint('v1', __name__)
book.api.register(bp_v1, url_prefix='/book')
user.api.register(bp_v1, url_prefix='/user')
return bp_v1
2.3 蓝图向Flask核心对象的注册
app/app.py
from flask import Flask
# 将Blueprint注册到flask核心对象上,并传入一个前缀'/v1'
def register_blueprints(app):
# from app.api.v1.user import user #(这些是没改造前,用blueprint的注册方式)
# from app.api.v1.book import book
# app.register_blueprint(user)
# app.register_blueprint(book)
from app.api.v1 import create_blueprint_v1
app.register_blueprint(create_blueprint_v1(), url_prefix = '/v1')
def create_app():
app = Flask(__name__) # 实例化flask核心对象
app.config.from_object('app.config.secure') # 读取配置文件下的secure ,app/config/secure.py
app.config.from_object('app.config.setting') # 读取配置文件下的setting, app/config/setting.py
register_blueprints(app) # 注册蓝图到核心对象上
return app
3.实现Redprint
因为我们的红图的作用就是要代替蓝图来实现试图函数的拆分,所以功能实现上可以参考蓝图的实现。
3.1 装饰性route的实现
蓝图的实现
def route(self, rule, **options):
"""Like :meth:`Flask.route` but for a blueprint. The endpoint for the
:func:`url_for` function is prefixed with the name of the blueprint.
"""
def decorator(f):
# 获取endpoint,默认为试图函数名
endpoint = options.pop("endpoint", f.__name__)
# 注册视图函数
self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator