在一个Flask 应用项目中,如果业务视图过多,可否将以某种方式划分出的业务单元单独维护,将每个单元用到的视图、静态文件、模板文件等独立分开?
例如从业务角度上,可将整个应用划分为用户模块单元、商品模块单元、订单模块单元,如何分别开发这些不同单元,并最终整合到一个项目应用中。
蓝图介绍在Flask中,使用蓝图Blueprint来分模块组织管理。【蓝图相当于Django中的子应用】
蓝图实际可以理解为是一个存储一组视图方法的容器对象,其具有如下特点:
- 一个应用可以具有多个Blueprint
- 可以将一个Blueprint注册到任何一个未使用的URL下比如 “/user”、“/goods”
- Blueprint可以单独具有自己的模板、静态文件或者其它的通用操作方法,它并不是必须要实现应用的视图和函数的
- 在一个应用初始化时,就应该要注册需要使用的Blueprint
但是一个Blueprint并不是一个完整的应用,它不能独立于应用运行,而必须要注册到某一个应用中。
蓝图简单使用方式使用蓝图可以分为三个步骤
-
创建一个蓝图对象【user是蓝图的名字】
user_bp=Blueprint('user',__name__)
-
在这个蓝图对象上进行操作,注册路由,指定静态文件夹,注册模版过滤器
@user_bp.route('/') def user_profile(): return 'user_profile'
-
在应用对象上注册这个蓝图对象
app.register_blueprint(user_bp)
示例代码:
from flask import Flask, Blueprint
app = Flask(__name__)
# 创建蓝图对象
user_bp = Blueprint('user', __name__)
@user_bp.route('/')
def user_profile():
return 'user_profile'
# 注册蓝图
app.register_blueprint(user_bp)
if __name__ == '__main__':
app.run()
运行效果:
单文件蓝图
可以将创建蓝图对象与定义视图放到一个文件中 。
目录(包)蓝图
对于一个打算包含多个文件的蓝图,通常将创建蓝图对象放到Python包的__init__.py
文件中
--------- project # 工程目录
|------ main.py # 启动文件
|------ user #用户蓝图
| |--- __init__.py # 此处创建蓝图对象
| |--- passport.py
| |--- profile.py
| |--- ...
|
|------ goods # 商品蓝图
| |--- __init__.py
| |--- ...
|...
示例代码:
__init__.py
from flask import Blueprint
goods_bp = Blueprint('goods', __name__)
from . import views
views.py
from . import goods_bp
@goods_bp.route('/goods')
def get_goods():
return 'get goods!'
test5.py:
from flask import Flask, Blueprint
app = Flask(__name__)
# 创建蓝图对象
user_bp = Blueprint('user', __name__)
@user_bp.route('/')
def user_profile():
return 'user_profile'
# 注册蓝图
# app.register_blueprint(user_bp)
app.register_blueprint(user_bp, url_prefix='/user')
from goods import goods_bp
app.register_blueprint(goods_bp)
if __name__ == '__main__':
app.run()

运行效果:
在应用中注册蓝图时使用url_prefix
参数指定
app.register_blueprint(user_bp, url_prefix='/user')
app.register_blueprint(goods_bp, url_prefix='/goods')
注意:在注册app.register_blueprint(book_bp, url_prefix="/book")或定义蓝图bp = Blueprint("book", __name__, url_prefix="/book")时,这两个地方只能一个地方定义url_prefix,若定义路径相同不受影响,若两个地方定义的不同的话,以app.register_blueprint(book_bp, url_prefix="/book")为准。
注意:两个地方同时指定url_prefix时不是路由的拼接。
示例代码:
from flask import Flask, Blueprint
app = Flask(__name__)
# 创建蓝图对象
user_bp = Blueprint('user', __name__)
@user_bp.route('/')
def user_profile():
return 'user_profile'
# 注册蓝图
app.register_blueprint(user_bp, url_prefix='/user')
if __name__ == '__main__':
app.run()
运行效果:
和应用对象不同,蓝图对象创建时不会默认注册静态目录的路由。需要在创建时指定 static_folder 参数。
下面的示例将蓝图所在目录下的static_admin目录设置为静态目录
admin = Blueprint("admin",__name__,static_folder='static_admin')
app.register_blueprint(admin,url_prefix='/admin')
现在就可以使用/admin/static_admin/
访问static_admin
目录下的静态文件了。
也可通过static_url_path
改变访问路径
admin = Blueprint("admin",__name__,static_folder='static_admin',static_url_path='/lib')
app.register_blueprint(admin,url_prefix='/admin')
static_folder可以是相对路径(相对蓝图文件所在的目录),也可以是绝对路径。在配置完蓝图后,还有一个需要注意的地方是如何在模板中引用静态文件。在模板中引用蓝图,应该要使用蓝图名+.+static来引用,如下所示:
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?