什么是Flask蓝图?

Jos*_*ons 158 python wsgi flask

阅读官方瓶文档的蓝图,甚至一个2上使用他们的博客文章.

我甚至在我的网络应用程序中使用它们,但我不完全了解它们是什么或它们如何适合我的应用程序整体.它是如何与我的应用程序的实例相似但不完全?文档是全面的,但我寻求外行解释或启发类比来为我激发它.当一位同事让我向他们解释我选择在这里询问的Flask蓝图时,我感到非常困惑.

Sea*_*ira 264

蓝图是用于生成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)
Run Code Online (Sandbox Code Playgroud)

这是一个用于处理树木的简单模具 - 它表示任何处理树木的应用程序都应该提供对树叶,树根和环的访问(按年).它本身就是一个空心壳 - 它无法路由,它无法响应,直到它被一个应用程序铭记:

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")
Run Code Online (Sandbox Code Playgroud)

一旦创建它,​​它就可以通过使用register_blueprint函数在应用程序上"留下深刻印象" - 这会在应用程序指定的位置"打动"蓝图的模型url_prefix.

  • 是的,"橡树/树叶"和"冷杉/树叶"都将由`def leaves`处理.`"mold"`是蓝图的名称,用于在引用路由时消除歧义(例如`someBlueprint.routeName`与`anotherBlueprint.routeName`). (6认同)
  • 这是一篇使用蓝图的应用程序结构的好文章.http://exploreflask.com/en/latest/blueprints.html (5认同)
  • 我还是很困惑.这是否意味着`oak/leaves`和`fir\leaves`会指向相同的代码?另外,`Blueprint("mold",__name __)`中字符串`mold`的目的是什么? (2认同)
  • 如何在函数中访问`url_prefix`?说,要检查是橡木还是冷杉?`tree_mold.url_prefix`给我一个`None` (2认同)
  • @Mellkor-只需使用“ url_for('。relative_route_name')”(注意前导点)。例如,“ url_for('。roots')”将在每个安装点自动提供正确范围的URL。 (2认同)

Hen*_*l B 11

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

一个简单的 Flask 应用程序

app = Flask(__name__)
Run Code Online (Sandbox Code Playgroud)

蓝图 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)
Run Code Online (Sandbox Code Playgroud)

上述应用程序中的蓝图

from flask import Blueprint
part_1 = Blueprint(part_1)

@part_1.route('/url')
def function()
    return view
Run Code Online (Sandbox Code Playgroud)


Tra*_*ong 9

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

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

引自文章:

这方面的一个例子是 Facebook。如果 Facebook 使用 Flask,它可能有静态页面的蓝图(即注销的主页、注册、关于等)、仪表板(即新闻提要)、配置文件(/robert/about 和 /robert/photos)、设置(/settings/security 和 /settings/privacy)等等。这些组件都共享通用布局和样式,但每个组件也有自己的布局

这是一个很好的解释,尤其是“如果Facebook使用Flask”那部分。它为我们提供了一个具体的情况来可视化蓝图的实际工作方式。


LFM*_*ekz 6

我自己也偶然发现了这一点,并在阅读了一些文档来源后感到困惑。起初我认为它就像 C#/Java 实现风格,你定义了一些东西,但不必担心它的实现细节,直到以后。然而,我偶然发现了这个页面,它用非常非常外行(和非常搞笑的当今事件)术语来描述它。https://hackersandslackers.com/flask-blueprints/

从本质上讲,链接中提到的一个好处是我可以清楚地了解它的实际使用情况,即我可以有效地将应用程序逻辑地组织/划分为几个只需要关心它自己事务的部分。所以它提供了一些设计好的封装。

编辑:我目前正在使用它来分割我的 webapps 代码。这也是一个很好的决定,因为我发现首席设计师想要在 Vue.js 中制作前端。我还没有使用过,但查看它的项目文件会看起来更加混乱,并且可能会提供许多容易发生命名冲突的问题。