07.蓝图与视图

发布时间 2023-11-19 18:36:57作者: 想要暴富的小男孩

蓝图与视图

简介

Flask 中的蓝图(Blueprint)是一种组织和管理应用程序路由和视图的机制。它允许开发者将相关功能的路由和视图进行分组,从而更好地组织项目结构和实现模块化开发。蓝图可以极大地简化大型应用并为扩展提供集中的注册入口。

Flask 可以通过蓝图来组织 URL 以及处理请求。如果使用蓝图,应用会在 Flask 层中进行管理,共享配置,通过注册按需改变应用对象。蓝图的缺点是一旦应用被创建后,只有销毁整个应用对象才能注销蓝图。

一个项目可以具有多个蓝图。但是一个蓝图并不是一个完整的应用,它不能独立于应用运行,而必须要注册到某一个应用中。

应用场景

  1. 项目复杂度增加,路由和视图函数增多。
  2. 路由需要结构化,模块化进行管理。

蓝图使用

创建蓝图对象

要使用蓝图,首先要声明一个蓝图对象。

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 才可以访问成功。