Flask中如何创建一个自己的蓝图

我们之前学习过蓝图的使用,能够方便的将我们的业务逻辑进行切分成各个模块,这样逻辑相似的功能放在一个目录,很实用。那我们如何实现一个自己的蓝图呢?

先看一个路由

1
@api.route('/v1/user/<int:uid>', methods=['GET'])

这样一个路由我们可以拆分成三个部分v1,user,<int:uid>

这里我们使用两层蓝图注册来实现上面的路由,第一层蓝图使用我们自己定义的红图来实现。

先看下实现

创建

创建我们自己的红图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

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):
# 如果不穿url_prefix 直接将红图的名字当做url_prefix
if url_prefix is None:
url_prefix = '/' + self.name

# 将保存的参数解包出来
for f, rule, options in self.mound:
endpoint = self.name + '+' options.pop("endpoint", f.__name__)
# 将上述参数参数add_url_rule 中
bp.add_url_rule(url_prefix + rule, endpoint, f, **options)

看下实现逻辑:

我们知道蓝图的路由机制是通过route装饰器实现的,先看下route的源码

1
2
3
4
5
6
7
8
9
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 = options.pop("endpoint", f.__name__)
self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator

看下参数:

rule就是路由,options就是一些关键字参数,如methods等。

这里的route方法的主要作用就是接收一组参数传入到蓝图add_url_rule中,实现视图函数到蓝图的注册。

我们在红图中一样要把视图函数注册到蓝图中,即调用蓝图的add_url_rule

因为我们要用红图的route来代替蓝图的route

在源码中,我们可以直接使用self.add_url_rule调用,我们怎么调用呢?

我们可以先将传入的参数保存进来,然后传入一个蓝图对象。在注册的时候调用add_url_rule

使用

在各个业务逻辑模块调用红图

下面是在user.py模块

1
2
3
4
5
6
7
api = Redprint('user')


@api.route('/<int:uid>', methods=['GET'])
def super_get_user(uid):
user = User.query.filter_by(id=uid).first_or_404()
return jsonify(user)
红图注册

在业务逻辑所属包的初始化模块__init__.py中注册

1
2
3
4
5
6
7
8
9
from flask import Blueprint
from app.api.v1 import user

def create_blueprint_v1():
bp_v1 = Blueprint('v1', __name__)
# 注册时候增加 user前缀
user.api.register(bp_v1, url_prefix='/user')
# 当存在多个业务逻辑模块的时候,依次注册
return bp_v1

这里我们将自己实现的红图注册到Flask的蓝图中。

蓝图注册

实现了红图到蓝图的注册后,我们需要将蓝图注册到Flask的核心对象上去

在工厂函数中注册

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from .app import Flask


def register_blueprints(app):
from app.api.v1 import create_blueprint_v1
# 定义 v1前缀
app.register_blueprint(create_blueprint_v1(), url_prefix='/v1')

def create_app():
app = Flask(__name__)

register_blueprints(app)

return app

这样子 我们就完成了自定义红图,然后注册到蓝图中,最终注册到Flask核心对象上。

ヾ(◍°∇°◍)ノ゙

知识就是财富
如果您觉得文章对您有帮助, 欢迎请我喝杯水!