我已经阅读了 Flask 官方文档中有关蓝图(Blueprints)的部分,还看了一篇或两篇有关它们如何使用的博客文章:文章一和文章二。
我甚至在我的 web 应用程序中使用了它们,但我仍然不完全理解它们是什么以及它们如何适应我的整个应用程序。它与我的应用程序实例有何相似之处,但又有所区别?虽然文档很详尽,但我需要一个通俗易懂的解释或一个启发性的比喻来帮助我理解。当同事要求我解释 Flask 蓝图时,我感到非常困惑,于是我决定在这里提问。
一个蓝图是用于生成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
指定的位置上将蓝图的模具“印记”到应用程序上。
正如@Devasish在评论中指出的,本文提供了一个很好的答案:
http://exploreflask.com/en/latest/blueprints.html
引用文章中的一段话:
一个例子是Facebook。如果Facebook使用Flask,那么它可能会有蓝图来处理静态页面(如未登录首页、注册、关于等)、仪表板(即新闻动态)、个人资料(/robert/about和/robert/photos)、设置(/settings/security和/settings/privacy)等多个组件。这些组件都共享一般的布局和样式,但每个组件也有自己的布局。
这是一个非常好的解释,尤其是 "如果Facebook使用Flask" 部分。它提供了一个具体的情境来展示蓝图的实际工作方式。
对于较大的项目,所有的代码不应该放在同一个文件中。 相反,您可以将较大的代码分段或拆分为单独的文件,主要基于功能。就像形成墙壁的砖块一样。
app = Flask(__name__)
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
oak/leaves
和fir\leaves
将指向相同的代码?另外,在Blueprint("mold", __name__)
中,字符串mold
的目的是什么? - Codevalleyoak/leaves
和fir/leaves
都将由def leaves
处理。"mold"
是蓝图的名称,在引用路由时用于消歧义(例如,someBlueprint.routeName
与anotherBlueprint.routeName
)。 - Sean Vieiraurl_prefix
?比如说,检查它是橡木还是冷杉。tree_mold.url_prefix
给了我一个None
。 - Arjunurl_for('。relative_route_name')
即可。例如,url_for('。roots')
将自动在每个已挂载点提供正确范围的URL。 - Sean Vieira