Flask框架知识系列之四

1,蓝图定义:

Flask 用 蓝图(blueprints) 的概念来在一个应用中或跨应用制作应用组件和支持通用的模式。
蓝图很好地简化了大型应用工作的方式,并提供给 Flask 扩展在应用上注册操作的核心方法。
一个 Blueprint 对象与 Flask 应用对象的工作方式很像,但它确实不是一个应用,而是一个描述如何构建或扩展应用的 蓝图

以上官方说法,太抽象,看以下解释:

蓝图 /Blueprint 是Flask应用程序 组件化 的方法,可以在一个应用内或跨越 多个项目共用蓝图。
使用蓝图可以极大地简化大型应用的开发难度,也为Flask扩展 提供了一种在应用中注册服务的集中式机制。

2,蓝图的应用场景

1,把一个应用分解为一个蓝图的集合。这对大型应用是理想的。一个项目可以实例化一个应用对象,初始化几个扩展,并注册一集合的蓝图。

2,以 URL 前缀和/或子域名,在应用上注册一个蓝图。 URL 前缀/子域名中的参数即成为这个蓝图下的所有视图函数的共同的视图参数(默认情况下)。

3,在一个应用中用不同的 URL 规则多次注册一个蓝图。

4,通过蓝图提供模板过滤器、静态文件、模板和其它功能。一个蓝图不一定要实现应用或者视图函数。

5,初始化一个 Flask 扩展时,在这些情况中注册一个蓝图。

Flask 中的蓝图不是即插应用,因为它实际上并不是一个应用——它是可以注册,甚至可以多次注册到应用上的操作集合。

蓝图对象没有办法独立运行,必须将它注册到一个应用对象上才能生效。

蓝图作为 Flask 层提供分割的替代,共享应用配置,并且在必要情况下可以更改所注册的应用对象

3,蓝图的缺点

它的缺点是你不能在应用创建后撤销注册一个蓝图而不销毁整个应用对象。
上面这句话我的理解是如下,不知对不对(很纠结):
如果在应用创建后,你撤销注册一个蓝图,那么就必须销毁整个应用对象。

4,使用蓝图的三个步骤

1.创建 一个蓝图对象
blue = Blueprint("blue",__name__)

2.在这个蓝图对象上进行 操作 ,例如注册路由、指定静态文件夹、注册模板过滤器...
@blue.route('/')
def blue_index():
    return 'Welcome to my blueprint'

3.在应用对象上 注册 这个蓝图对象
app.register_blueprint(blue,url_prefix='/blue')

5,蓝图的运行机制--说白了就是会自动补充URL前缀,并且能使用相同的视图函数

蓝图并不是一个可插拔的应用 —— 它只是保存了一组 将来 可以在应用对象上执行 的 操作 —— 注册路由就是一种操作。

当在应用对象上调用 route 装饰器或使用 add_url_rule()方法 注册路由时, 我们已经知道,这个操作将修改应用对象的两张路由表:url_map和view_functions;

然而,蓝图对象根本就没有路由表,当我们在蓝图对象上调用route装饰器或使用 add_url_rule()方法注册路由时,它只是在内部的一个延迟操作记录列表 defered_functions 中添加了一项:

下图为blueprint和Flask route的对比:

这里写图片描述

lambad s: s.add_url_rule('/',view_func=ezbp_index)定义了一个匿名函数, 参数s就是将来被传入的应用对象。

当执行应用对象的 register_blueprint() 方法时,应用对象将从蓝图对象的 defered_functions 列表中取出每一项,并以自身 作为参数执行该匿名函数 —— 即调用应用对象的 add_url_rule() 方法,这将真正的 修改应用对象的两张路由表。

所以说,蓝图这个名字起得的确恰当,蓝图的那些方法仅仅记录了未来应该发生的操作, 而不是当即实现。

蓝图的URL前缀

继续使用上面的图,注意其中被橘黄色荧光笔涂抹的代码:

当我们在应用对象上注册一个蓝图时,需要指定一个url_prefix关键字 参数(这个参数默认是/)。
在上面的图中可以看到,在应用最终的路由表 url_map中,在蓝图上注册的路由URL自动被加上了这个前缀。

这相当有用,我们可以在多个蓝图中使用相同的URL规则而不会最终引起冲突,
只要在 注册蓝图时将不同的蓝图挂接到不同的自路径即可 —— 想一想对于大型应用而言,不同 的蓝图通常是不同的人员开发的,你很难保证URL规则不发生冲突!

6,蓝图的endpoint--加上蓝图前缀

图继续,这次关注绿色荧光笔涂抹的代码:

我们创建蓝图对象时,第一个参数指定了蓝图的名字。当在应用中注册蓝图时, 蓝图的路由项中的访问点endpoint被自动添加了这个名字。

这有什么用?这涉及到 url_for() 的正确工作与否。

当不同的团队开发不同的蓝图时,和URL规则类似,你很难保证他们的视图函数名 彼此不同,尤其像index这样俗套的名字。如果不对来自不同蓝图的endpoint 进行区隔,那么 url_for('index') 到底应该生成那个URL?这显然无法确定。

一旦给不同蓝图的endpoint加上了蓝图名前缀,我们可以确切地告诉url_for() 了:
url_for('shop.v_index') # /shop/
url_for('admin.v_index') # /admin/

7,注册静态目录路由

和应用对象不同,蓝图对象创建时不会默认注册静态目录的路由。
需要我们在 创建时指定 static_folder 参数。

下面的示例将蓝图所在目录下的 ezstatic目录设置为静态目录:

admin = Blueprint("admin",__name__,static_folder='ezstatic')
app.register_blueprint(admin,url_prefix='/admin')

默认情况下Flask使用文件夹的名称注册静态文件夹的路由:

这里写图片描述

现在就可以使用 /admin/ezstatic/<filename> 访问mystatic目录下的静态文件了。

定制静态目录URL规则 :可以在创建蓝图对象时使用 static_url_path 来改变静态 目录的路由。下面的示例将为ezstatic文件夹的路由设置为 /lib:

admin = Blueprint("admin",__name__,static_folder='ezstatic',static_url_path='/lib')
app.register_blueprint(admin,url_prefix='/admin')

这时的路由表如下:

这里写图片描述

这样我们可以使用地址/admin/lib/main.css访问ezstatic目录下的main.css文件了

8,设置模板目录

蓝图对象没有默认的模板目录,可以在创建蓝图对象时使用 template_folder 关键字参数设置模板目录。
下面的示例将蓝图目录下的 mytpls 目录设置为模板目录:

admin = Blueprint('admin',__name__,template_folder='mytpls')

9,使用蓝图循环导入的问题

from flask import Blueprint
api = Blueprint('api', __name__)
from . import view

这边解释一下,首先定义一个蓝图,这个不用讲了,你用之前,肯定要定义一下吧,蓝图名字就叫api。

下面一行代码有点意思,from . import view, 这个代码,我发现用蓝图的人,很多都忘写了。

如果你是一个python老手,你应该知道,导入python文件,其实就是运行导入的那个文件。

在这边,你导入一次,就是告诉上级,这边还有个view.py文件,里面覆盖了一些接口。

整个根(run.py)就知道,哦,如果有接口访问这,我就指向你这边。

10,参考如下文章:

http://docs.jinkan.org/docs/flask/blueprints.html
http://www.cnblogs.com/fuzzier/p/6078761.html
http://www.cnblogs.com/yueerwanwan0204/p/5522749.html
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,160评论 22 257
  • 解释1: 允许将应用组织为模块,每个模块有自洽的 MVC,开发者做些工作可以使模块间依赖尽可能少,必要时可以按 b...
    大诗兄_zl阅读 2,188评论 1 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,601评论 18 139
  • flask是python的一个web应用框架,django很多人听过,flask比较少见,连创始人一开始写出来只是...
    思而忧阅读 2,932评论 0 5
  • 2017年4月25日(连续第70天总结) 今日目标完成情况: 1:稻盛与阿米巴案例 100% 2:抄写概念5遍 1...
    我来学而时习之阅读 245评论 0 0