模仿Blueprint设计Redprint

假设要定义两个路由:/v1/user/get/v1/book/get,很容易想到的一种实现方法是:写3个python文件,app.py,book.py,user.py,代码分别如下:

  • book.py
from flask import Blueprint

book = Blueprint("book", __name__)

@book.route("/get")
def get_book():
    return "get book"
  • user.py
from flask import Blueprint

user = Blueprint("user", __name__)

@user.route("/get")
def get_user():
    return "get user"
  • app.py
from flask import Flask

app = Flask(__name__)
app.register_blueprint(user, url_prefix='/v1/user')
app.register_blueprint(book, url_prefix='/v1/book')

这种写法没问题,但最近在看https://coding.imooc.com/class/220.html的课程中学到了一种更pythonic的写法,设计思路如下:

在这里插入图片描述
需要模仿Blueprint自定义一个类Redprint,在类中实现两个必要的方法:route()实现一个注册路由的装饰器,register()用来将Redprint对象注册到Blueprint上,代码如下:

  • 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:
            # 仿照 Blueprint 中 route 方法的写法
            endpoint = self.name + '+' + options.pop('endpoint', f.__name__)
            bp.add_url_rule(url_prefix + rule, endpoint, f, **options)
  • book.py
from redprint import Redprint

api = Redprint("book")


@api.route("/get")
def get_book():
    return "get book"
  • user.py
from redprint import Redprint

api = Redprint("user")


@api.route("/get")
def get_user():
    return "hello"


@api.route("/create")
def create_user():
    return "create user"
  • app.py
from flask import Flask


def register_blueprints(app):
    from flask import Blueprint
    from test import book, user

    bp_v1 = Blueprint('v1', __name__)

    # 将Redprint注册到Blueprint中
    book.api.register(bp_v1)
    user.api.register(bp_v1)

    # 将Blueprint注册到APP中
    app.register_blueprint(bp_v1, url_prefix='/v1')


app = Flask(__name__)
register_blueprints(app)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值