Flask蓝图是什么?

224

我已经阅读了 Flask 官方文档中有关蓝图(Blueprints)的部分,还看了一篇或两篇有关它们如何使用的博客文章:文章一文章二

我甚至在我的 web 应用程序中使用了它们,但我仍然不完全理解它们是什么以及它们如何适应我的整个应用程序。它与我的应用程序实例有何相似之处,但又有所区别?虽然文档很详尽,但我需要一个通俗易懂的解释或一个启发性的比喻来帮助我理解。当同事要求我解释 Flask 蓝图时,我感到非常困惑,于是我决定在这里提问。

5个回答

330

一个蓝图是用于生成Web应用程序“部分”的模板。你可以将其视为一种模具:

刚从上面拿下来的金色勋章的花纹模具

您可以将蓝图应用于应用程序中的多个位置。每次应用它时,蓝图都会在应用程序的石膏中创建其结构的新版本。

# 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指定的位置上将蓝图的模具“印记”到应用程序上。


12
以下是使用蓝图创建应用程序结构的一篇不错的文章:http://exploreflask.com/en/latest/blueprints.html。 - Devasish
9
我仍然有些困惑。这是否意味着oak/leavesfir\leaves将指向相同的代码?另外,在Blueprint("mold", __name__)中,字符串mold的目的是什么? - Codevalley
11
是的,oak/leavesfir/leaves都将由def leaves处理。 "mold"是蓝图的名称,在引用路由时用于消歧义(例如,someBlueprint.routeNameanotherBlueprint.routeName)。 - Sean Vieira
2
我如何在函数中访问url_prefix?比如说,检查它是橡木还是冷杉。tree_mold.url_prefix给了我一个None - Arjun
3
使用url_for('。relative_route_name')即可。例如, url_for('。roots')将自动在每个已挂载点提供正确范围的URL。 - Sean Vieira
显示剩余6条评论

11

正如@Devasish在评论中指出的,本文提供了一个很好的答案:

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

引用文章中的一段话:

一个例子是Facebook。如果Facebook使用Flask,那么它可能会有蓝图来处理静态页面(如未登录首页、注册、关于等)、仪表板(即新闻动态)、个人资料(/robert/about和/robert/photos)、设置(/settings/security和/settings/privacy)等多个组件。这些组件都共享一般的布局和样式,但每个组件也有自己的布局。

这是一个非常好的解释,尤其是 "如果Facebook使用Flask" 部分。它提供了一个具体的情境来展示蓝图的实际工作方式。


10

对于较大的项目,所有的代码不应该放在同一个文件中。 相反,您可以将较大的代码分段或拆分为单独的文件,主要基于功能。就像形成墙壁的砖块一样。

一个简单的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

这个例子展示了如何使用蓝图,而不是为什么和如何使用它们的好处。 - undefined
你能试着阅读一下第一部分吗?如果你正试图实现蓝图,这应该足够了。如果需要更多信息,你可以参考与蓝图相关的Flask文档。https://flask.palletsprojects.com/en/2.3.x/blueprints/ - undefined

7
我也刚刚偶然发现了这个,并在阅读了几篇文档后感到困惑。起初我以为它类似于C#/Java OOP接口实现风格,您可以定义一些内容,但不必担心稍后的实现细节。然而,我发现了这个网页,它以非常通俗易懂(并且相当有趣的现代事件)的方式解释了它。https://hackersandslackers.com/flask-blueprints/ 基本上,该链接提到的一个好处并向我提供了它在现实世界中的使用清晰的想法,那就是我可以有效地将应用程序逻辑地组织/分割成几个只需要关注自己事务的部分,因此它提供了一些设计上的封装。
编辑:我目前正在使用它来分离我的Web应用程序代码。 这是一个明智的决定,因为我发现首席设计师希望在Vue.js中制作前端。 而我之前并没有使用过它,但是查看其项目文件可能会变得混乱,并且由于具有类似名称的文件,可能会提供许多命名冲突问题。

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

1
这并没有回答用户的问题。他提到了他使用过它们并阅读过相关内容。他需要一个更低层次的解释 Flask 蓝图。它们在幕后是如何工作的? - Mo. Atairu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接