蓝图与视图
在这部分内容中,我们将讲解 Flask 框架中的蓝图(Blueprint)和视图。蓝图是组织和管理路由和视图的一种机制,能帮助我们更好地管理复杂的应用程序结构。
简介
Flask 中的蓝图(Blueprint)是一种组织和管理应用程序路由和视图的机制。它允许开发者将相关功能的路由和视图进行分组,从而更好地组织项目结构和实现模块化开发。蓝图可以极大地简化大型应用并为扩展提供集中的注册入口。
Flask 可以通过蓝图来组织 URL 以及处理请求。如果使用蓝图,应用会在 Flask 层中进行管理,共享配置,通过注册按需改变应用对象。蓝图的缺点是一旦应用被创建后,只有销毁整个应用对象才能注销蓝图。
一个项目可以具有多个蓝图。但是一个蓝图并不是一个完整的应用,它不能独立于应用运行,而必须要注册到某一个应用中。
首先,什么是蓝图?简单来说,蓝图是 Flask 中的一种机制,它让我们能够将路由和视图函数进行组织和分组。可以把它看作是一个小型的应用模块。每个蓝图包含了自己的路由、视图函数、模板和静态文件,它们是相互独立的模块,最终可以注册到主应用中,形成完整的 Flask 应用。如果你的应用比较大,或者路由和视图函数越来越多,使用蓝图就能帮助你更好地组织代码,避免代码变得混乱。要注意,蓝图并不能单独运行,它必须注册到 Flask 应用中。所以,虽然蓝图在结构上看起来像是一个小应用,但它其实依赖于主应用来运行。
应用场景
- 项目复杂度增加,路由和视图函数增多。
- 路由需要结构化,模块化进行管理。
那么,蓝图具体的应用场景有哪些呢?通常来说,当你的项目变得越来越复杂,路由和视图函数不断增多时,使用蓝图可以帮助你进行模块化管理。比如,你可以为用户相关的操作定义一个蓝图,为商品相关的操作定义另一个蓝图,这样每个蓝图只关注一部分功能。就像我们这里展示的图示,用户相关的视图函数就可以归到“用户蓝图”中,商品相关的视图函数可以归到“商品蓝图”中,然后通过注册这些蓝图到主应用中,最终形成一个完整的项目结构。这样做不仅让代码更清晰,也能让项目更易于扩展。
蓝图使用
接下来我们来详细看一下如何在 Flask 中使用蓝图。
创建蓝图对象
要使用蓝图,首先要声明一个蓝图对象。
from flask import Blueprint
# 1. 蓝图的声明
goods_router = Blueprint(name="goods", import_name=__name__)
在使用蓝图之前,我们首先需要创建一个蓝图对象。可以看到,创建蓝图对象只需要从 Flask 中导入 Blueprint 类,并提供两个参数。
- 参数说明:
name
:蓝图的名称import_name
:蓝图所在的模块 ,一般定义为__name__
这两个是必填参数。
第一个参数是蓝图的名称,它是一个字符串,通常我们可以给蓝图起个有意义的名字,比如这里我们给商品蓝图命名为 goods。第二个参数是模块的名字,通常我们用 name 来表示。这两个参数是必须提供的,之后,我们就可以用这个蓝图对象来定义路由了。
定义路由
声明了蓝图之后,就可以获得蓝图对象 goods_router
。接下来需要使用蓝图对象去定义路由。
路由定义需要使用 /
开头。如果需要指定非 GET 的请求方法,同样通过 methods 参数指定,methods 的值为列表。
# 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 请求,返回一个成功的消息。第二个路由是 "/add",它是一个 POST 请求,用于添加商品。这样,当我们访问 / 路由时,会返回商品列表;访问 /add 路由时,会返回添加商品的结果。
注册蓝图对象
当完成上面两步以后,就可以去验证一下路由。需要在启动 flask 服务之前,将蓝图注册到 flask 启动对象中。
应用启动后,通过 /
和 /add
就可以访问到到蓝图中定义的视图函数。
from flask import Flask
app = Flask(__name__)
if __name__ == '__main__':
# 注册蓝图
app.register_blueprint(goods_router)
app.run(port=5055, debug=True)
定义好蓝图和路由后,接下来我们需要做的就是将蓝图对象注册到 Flask 应用中。注册蓝图是非常重要的,因为 Flask 只有知道了哪些蓝图被注册到应用中,它才知道如何处理这些路由。在 Flask 启动前,我们通过 app.register_blueprint() 方法将 goods_router 蓝图注册到应用中。然后启动 Flask 应用后,浏览器访问 / 和 /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)
除了普通的蓝图注册,Flask 还允许我们为蓝图定义一个 URL 前缀。这样做的好处是,我们可以在多个蓝图中使用相同的路由名称,而不会发生冲突。比如,我们给用户蓝图设置了 /user 前缀,那么所有在这个蓝图中定义的路由都会自动加上 /user 前缀。比如,如果我们定义了一个 /login 路由,那么实际的 URL 会变成 /user/login,访问这个 URL 就会触发对应的视图函数。
当设置了 url_prefix
参数后,定义路由时,如果路由直接使用 url_prefix
的值,则 route()
方法中传入空字符串即可。
如果需要在 url_prefix
值的基础上再加下一级路由,则在 route()
方法中传入对应路由即可,需要使用 /
开头
此时,如果访问的是http://127.0.0.1:5055/login
,会报错 404。
这就是参数 url_prefix
起了作用,需要在访问路由的时候,加上前缀 /user
,也就是 /user/login
才可以访问成功。
如果访问时没有加上前缀 /user,就会返回 404 错误。这说明,URL 前缀的作用就体现在这里:它会自动把前缀加到每个路由前面。
总结
- 创建蓝图对象
- 通过蓝图定义路由
- 注册蓝图对象
- 定义 URL 前缀
我们今天学习了如何使用 Flask 的蓝图来管理和组织路由。通过蓝图,我们可以将路由和视图函数按功能模块进行分组,提升代码的组织性和可维护性。