在一个Flask 应用项目中,如果业务视图过多,可否将以某种方式划分出的业务单元单独维护,将每个单元用到的视图、静态文件、模板文件等独立分开?
例如从业务角度上,可将整个应用划分为用户模块单元、商品模块单元、订单模块单元,如何分别开发这些不同单元,并最终整合到一个项目应用中?
一、蓝图介绍
在Flask中,使用蓝图Blueprint来分模块组织管理。
蓝图实际可以理解为是一个存储一组视图方法的容器对象,其具有如下特点:
- 一个应用可以具有多个Blueprint
- 可以将一个Blueprint注册到任何一个未使用的URL下比如 “/user”、“/goods”
- Blueprint可以单独具有自己的模板、静态文件或者其它的通用操作方法,它并不是必须要实现应用的视图和函数的
- 在一个应用初始化时,就应该要注册需要使用的Blueprint
二、使用步骤
1、单个文件的蓝图
使用蓝图可以分为三个步骤
- 创建一个蓝图对象
login_bp=Blueprint('register',__name__)
- 在这个蓝图对象上进行操作,注册路由,指定静态文件夹,注册模版过滤器
@login_bp.route('/')
def login():
return render_template('static/guojia.jpg')
- 在应用对象上注册这个蓝图对象
特别注意1:在应用中注册蓝图时使用url_prefix参数指定
app.register_blueprint(login_bp,url_prefix='/register')
2、独立模块的蓝图(用的最多)
特别注意2:创建蓝图的代码,放到__init__文件中
创建蓝图代码块(__init__文件)
特别注意3:第六行代码一定要写from register.register import register
为什么呢?
执行项目python app.py,先执行app.py文件中第13行注册蓝图,遇到名称为register_bp的蓝图,随后代码去__init__文件中找到该蓝图第4行,但是操作蓝图的视图加载不出来,所以程序会报错。所以要在__init__文件中,创建完蓝图之后,导入蓝图视图模块
from flask import Flask,Blueprint
#创建蓝图,对应的register目录
register_bp=Blueprint('register',__name__)
from register.register import register
操作蓝图代码块(register.py)
from flask import Flask,Blueprint
from register import register_bp
#蓝图上操作,注册路由
@register_bp.route('/')
def register():
return "注册页面"
注册蓝图代码块(app.py)
from flask import Flask
from users import *
from order.order_func import *
from login import login_bp
from register import register_bp
app = Flask(__name__)
#注册蓝图
app.register_blueprint(user_bp,url_prefix='/users')
#在应用对象上注册蓝图
app.register_blueprint(register_bp,url_prefix='/register')
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True)
3、蓝图中的静态资源和模板
和应用对象不同,蓝图对象创建时不会默认注册静态目录的路由。需要我们在 创建时指定 static_folder 参数。
例如
register_bp=Blueprint('register',__name__,static_folder='static',template_folder='templates')
案例:
创建蓝图代码块
from flask import Flask,Blueprint
#创建蓝图,对应的register目录
register_bp=Blueprint('register',__name__,static_folder='static',template_folder='templates')
from register.register import register
定义蓝图视图代码块
from flask import Flask,Blueprint
from register import register_bp
#蓝图上操作,注册路由
@register_bp.route('/')
def register():
return "注册页面"
注册蓝图代码块
from flask import Flask
from users import *
from order.order_func import *
from login import login_bp
#from register.register import register_bp
from register import register_bp
app = Flask(__name__)
#在应用对象上注册蓝图
app.register_blueprint(login_bp,url_prefix='/login')
#在应用对象上注册蓝图
app.register_blueprint(register_bp,url_prefix='/register')
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True)