蓝图与视图
简介
Flask 中的蓝图(Blueprint)是一种组织和管理应用程序路由和视图的机制。它允许开发者将相关功能的路由和视图进行分组,从而更好地组织项目结构和实现模块化开发。蓝图可以极大地简化大型应用并为扩展提供集中的注册入口。
Flask 可以通过蓝图来组织 URL 以及处理请求。如果使用蓝图,应用会在 Flask 层中进行管理,共享配置,通过注册按需改变应用对象。蓝图的缺点是一旦应用被创建后,只有销毁整个应用对象才能注销蓝图。
一个项目可以具有多个蓝图。但是一个蓝图并不是一个完整的应用,它不能独立于应用运行,而必须要注册到某一个应用中。
应用场景
- 项目复杂度增加,路由和视图函数增多。
- 路由需要结构化,模块化进行管理。
蓝图使用
创建蓝图对象
要使用蓝图,首先要声明一个蓝图对象。
from flask import Blueprint
# 1. 蓝图的声明
goods_router = Blueprint(name="goods", import_name=__name__)
- 参数说明:
name
:蓝图的名称import_name
:蓝图所在的模块 ,一般定义为__name__
这两个是必填参数。
定义路由
声明了蓝图之后,就可以获得蓝图对象 goods_router
。接下来需要使用蓝图对象去定义路由。
# 2. 路由定义
@goods_router.route("/")
def index():
return {"code":0, "msg": "get success", "data": []}
@goods_router.route("/add", methods=["POST"])
def add_goods():
return {"code":0, "msg": "add success"}
路由定义需要使用 /
开头。如果需要指定非 GET 的请求方法,同样通过 methods 参数指定,methods 的值为列表。
注册蓝图对象
当完成上面两步以后,就可以去验证一下路由。需要在启动 flask 服务之前,将蓝图注册到 flask 启动对象中:
from flask import Flask
app = Flask(__name__)
if __name__ == '__main__':
# 注册蓝图
app.register_blueprint(goods_router)
app.run(port=5055, debug=True)
应用启动后,通过 /
和 /add
就可以访问到到蓝图中定义的视图函数。
定义 URL 前缀
当在应用对象上注册一个蓝图时,还可以指定一个 url_prefix
关键字参数,该参数是字符串类型,并且必须以 /
开头,默认是 /
。
它的作用是在蓝图上注册的路由 URL 自动会加上这个前缀。这样可以保证在多个蓝图中使用相同的 URL 规则而不会最终引起冲突。这样就可以在不同的前缀下定义行为,比如增删改查。
from flask import Blueprint
user_router = Blueprint("user", __name__, url_prefix="/user")
@user_router.route("")
def user_list():
return {"code": 0, "msg": "get success", "data": []}
@user_router.route("/login", methods=["POST"])
def login():
return {"code": 0, "msg": "login success"}
if __name__ == '__main__':
# 注册蓝图
app.register_blueprint(user_router)
app.run(port=5055, debug=True)
当设置了 url_prefix
参数后,定义路由时,如果路由直接使用 url_prefix
的值,则 route()
方法中传入空字符串即可。
如果需要在 url_prefix
值的基础上再加下一级路由,则在 route()
方法中传入对应路由即可,需要使用 /
开头
此时,如果访问的是http://127.0.0.1:5055/login
,会报错 404
这就是参数 url_prefix
起了作用,需要在访问路由的时候,加上前缀 /user
,也就是 /user/login
才可以访问成功。