Flask蓝图究竟是什么?

226 投票
5 回答
87208 浏览
提问于 2025-04-18 11:06

看过关于蓝图的Flask官方文档,还看过一篇两篇博客文章,讲的是如何使用它们。

我在我的网页应用中也用过蓝图,但我对它们是什么,或者它们在我的应用中是如何运作的,还是不太明白。它和我的应用实例有什么相似之处,但又不完全一样呢?文档写得很详细,但我想要一个简单易懂的解释,或者一个能让我恍然大悟的比喻。因为有同事问我能不能给他们解释一下Flask蓝图,我感到很困惑,所以我决定在这里问问。

5 个回答

4

Flask蓝图可以帮助你创建可重复使用的应用实例。它通过将你的项目组织成模块来实现这一点。这些模块随后会被注册到主应用中。蓝图有助于创建一个应用工厂。

8

我最近也碰到了这个问题,看了一些文档后有点困惑。起初我以为这和C#/Java的面向对象编程接口实现方式差不多,就是先定义一些东西,具体的实现细节可以稍后再处理。不过,我发现了一个网页,用非常简单易懂的方式(还有一些搞笑的现代事件)解释了这个概念。你可以看看这个链接:https://hackersandslackers.com/flask-blueprints/

这个链接提到的一个好处让我对它在实际应用中的用法有了清晰的认识,那就是我可以有效地逻辑上组织和划分我的应用,把它分成几个部分,每个部分只需要关注自己的事情。这就提供了一种设计上的封装。

补充一下:我现在正在用它来划分我的网页应用代码。这是个不错的决定,因为我发现主设计师想用Vue.js来做前端。我还没用过Vue.js,但看它的项目文件会显得更加杂乱,可能会因为文件名相似而导致很多命名冲突的情况。

11

对于较大的项目,所有的代码不应该放在同一个文件里。相反,你可以把较大的代码分成几个不同的文件,通常是根据功能来划分。就像用砖块砌成一面墙一样。

一个简单的Flask应用

app = Flask(__name__)

一个有蓝图的Flask应用

import from_any_module.part_1
import from_other_module.part_2

app = Flask(__name__)

app.register_blueprint(part_1)
app.register_blueprint(part_2)

上面应用中的蓝图

from flask import Blueprint
part_1 = Blueprint(part_1)

@part_1.route('/url')
def function()
    return view
12

正如@Devasish在一个评论中提到的,这篇文章提供了一个很好的答案:

http://exploreflask.com/en/latest/blueprints.html

引用文章中的内容:

举个例子,比如Facebook。如果Facebook使用Flask,它可能会有一些蓝图来处理静态页面(比如登出后的首页、注册页面、关于页面等)、仪表盘(比如新闻动态)、个人资料(如/robert/about和/robert/photos)、设置(如/settings/security和/settings/privacy)等等。这些部分都有一个共同的布局和风格,但每个部分也有自己独特的布局。

这个解释非常好,特别是“如果Facebook使用Flask”这句话。它给我们提供了一个具体的场景,让我们更容易理解蓝图是如何运作的。

333

蓝图就像是一个模板,用来生成网页应用程序中的一个“部分”。你可以把它想象成一个模具:

一个金色奖章刚从模具中取出

你可以在应用程序的多个地方使用这个蓝图。每次使用时,蓝图都会在应用程序的“泥土”中创建一个新的结构版本。

# An example
from flask import Blueprint

tree_mold = Blueprint("mold", __name__)

@tree_mold.route("/leaves")
def leaves():
    return "This tree has leaves"

@tree_mold.route("/roots")
def roots():
    return "And roots as well"

@tree_mold.route("/rings")
@tree_mold.route("/rings/<int:year>")
def rings(year=None):
    return "Looking at the rings for {year}".format(year=year)

这是一个简单的模具,用于处理树木——它说明任何处理树木的应用程序都应该提供对树叶、树根和年轮的访问。单独来看,它只是一个空壳——它不能进行路由,也不能响应,直到它被应用到一个应用程序上:

from tree_workshop import tree_mold

app.register_blueprint(tree_mold, url_prefix="/oak")
app.register_blueprint(tree_mold, url_prefix="/fir")
app.register_blueprint(tree_mold, url_prefix="/ash")

一旦创建,就可以通过使用 register_blueprint 函数将其“印刷”到应用程序中——这会在 url_prefix 指定的位置将蓝图的模具印在应用程序上。

撰写回答