Flask 蓝图BluePrint

  在用 Flask 框架开发应用时,如果把所有的请求方法都写在一个文件里会显得非常难受,可读性差,后期维护堪忧。用过django的同学知道,django 项目可以有多个app,每个app都可以设置自己的访问路由,然后通过一级路由对每个app路由进行管理,实现路由的分层功能。Flask 也有类似的方法实现路由分层,不过叫法不同,一般称之为模块化。

 

一、创建蓝图

1、首先我们来看下路由配置在app.py文件中例子,有4个计算公式,似乎看着还行。若有100个计算公式,阅读或维护代码的体验就非常糟糕了。

import json
from flask import Flask,request

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

# 乘法接口
@app.route('/multiplication',methods=['POST'])
def multiplication():
    data = json.loads(request.data.decode())
    res = data['a']*data['b']
    return json.dumps(res)

# 除法接口
@app.route('/division',methods=['POST'])
def division():
    data = json.loads(request.data.decode())
    res = data['a']/data['b']
    return json.dumps(res)

# 加法接口
@app.route('/plus',methods=['POST'])
def plus():
    data = json.loads(request.data.decode())
    res = data['a']+data['b']
    return json.dumps(res)

# 减法接口
@app.route('/minus',methods=['POST'])
def minus():
    data = json.loads(request.data.decode())
    res = data['a']-data['b']
    return json.dumps(res)

if __name__ == '__main__':
    app.debug = True
    app.run(host = '0.0.0.0',port=6000)

2、怎么实现模块化呢,先创建两个py文件,将刚才四个计算函数分别写入

math_lower.py 文件代码:

import json
from flask import request,Blueprint

# 创建一个蓝图对象,第一个参数 math_low 表示蓝图的名称,第二个参数 __name__ 表示蓝图所在的模块
math_l = Blueprint('math_low',__name__)

# 加法接口
@math_l.route('/plus',methods=['POST'])
def plus():
    data = json.loads(request.data.decode())
    res = data['a']+data['b']
    return json.dumps(res)

# 减法接口
@math_l.route('/minus',methods=['POST'])
def minus():
    data = json.loads(request.data.decode())
    res = data['a']-data['b']
    return json.dumps(res)

math_medium.py 文件代码:

import json
from flask import request,Blueprint

# 创建一个蓝图对象,math_medium表示蓝图的名称,__name__表示蓝图所在的模块
math_m = Blueprint('math_medium',__name__)

# 乘法接口
@math_m.route('/multiplication',methods=['POST'])
def multiplication():
    data = json.loads(request.data.decode())
    res = data['a']*data['b']
    return json.dumps(res)

# 除法接口
@math_m.route('/division',methods=['POST'])
def division():
    data = json.loads(request.data.decode())
    res = data['a']/data['b']
    return json.dumps(res)

app.py 文件代码:

from flask import Flask
from api.math_lower import math_l
from api.math_medium import math_m

app = Flask(__name__)
# 将创建的蓝图注册到app
app.register_blueprint(math_l)
app.register_blueprint(math_m)

if __name__ == '__main__':
    app.debug = True
    app.run(host = '0.0.0.0',port=6000)

 

运行 python app.py,调用接口测试一下:

 

二、蓝图的 url 前缀

  当我们在应用对象上注册一个蓝图时,可以指定一个url_prefix关键字参数。这样可以保证在多个蓝图使用相同的URL规则而不会最终引起冲突,只要在注册蓝图时将不同的蓝图挂接到不同的路径即可。

修改 app.py 文件

from flask import Flask
from api.math_lower import math_l
from api.math_medium import math_m

app = Flask(__name__)
# 将创建的蓝图注册到app,第一个参数是蓝图对象,第二个参数是url前缀
app.register_blueprint(math_l,url_prefix = '/math')
app.register_blueprint(math_m,url_prefix = '/math')

if __name__ == '__main__':
    app.debug = True
    app.run(host = '0.0.0.0',port=6000)

plus接口加上 /math 前缀后测试一下:

 

posted @ 2022-10-24 14:44  三只松鼠  阅读(285)  评论(0编辑  收藏  举报