flask 蓝图

解释1:

允许将应用组织为模块,每个模块有自洽的 MVC,开发者做些工作可以使模块间依赖尽可能少,必要时可以按 blueprint 为单位做垂直拆分。

依赖反转,允许把 route 挂到 blueprint 对象而非全局 app 对象上。

解释2:

1 概述

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

2 初识蓝图

蓝图/Blueprint对象用起来和一个应用/Flask对象差不多,最大的区别在于一个 蓝图对象没有办法独立运行,必须将它注册到一个应用对象上才能生效。

使用蓝图可以分为三个步骤

1.创建一个蓝图对象

ezbp =Blueprint("ezbp",__name__)

2.在这个蓝图对象上进行操作,入注册路由、指定静态文件夹、注册模板过滤器...

@ezbp.route('/')defezbp_index():return'Welcome to my blueprint'

3.在应用对象上注册这个蓝图对象

app.register_blueprint(ezbp,url_prefix='/ezbp')

当这个应用启动后,通过/ezbp/可以访问到蓝图中定义的视图函数。

考察上面的代码,可以看到在蓝图对象上注册路由的方法和在应用对象上完全 一样,那么,值得思考的是,蓝图和应用对象的运行机制是一样的吗?

example:

#-*- coding:utf-8 -*-fromflaskimportFlask,Blueprintapp= Flask(__name__)

@app.route('/')defapp_index():return'go blueprint'ezbp = Blueprint("ezbp",__name__)

@ezbp.route('/')defezbp_index():return'Welcome to my blueprint'app.register_blueprint(ezbp,url_prefix='/ezbp')

app.run(host='0.0.0.0',port=80)

ouptut:

3 运行机制———说白了就是会自动补充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()方法,这将真正的 修改应用对象的两张路由表。

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

2 蓝图的URL前缀

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

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

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

example:

#-*- coding:utf-8 -*-fromflaskimportFlask,Blueprint

shop= Blueprint('shop','shop')

@shop.route('/')defv_index():return'shop root'vip= Blueprint('vip','vip')

@vip.route('/')defv_index():return'vip homepage'admin= Blueprint('admin','admin')

@admin.route('/')defv_index():return'admin root'app= Flask(__name__)

app.register_blueprint(shop,url_prefix='/')

app.register_blueprint(admin,url_prefix='/admin')

app.register_blueprint(vip,url_prefix='/vip')

app.run(host='0.0.0.0',port=80)

output:

4 蓝图的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/

example:

#-*- coding:utf-8 -*-fromflaskimportFlask,Blueprint,url_for,render_template_string

shop= Blueprint('shop',__name__)

@shop.route('/')defv_index():return'''

  • Here is shop you can go admin
  • '''admin= Blueprint('admin',__name__)

    @admin.route('/')defv_index():return'''

  • Here is admin you can go shop
  • '''app= Flask(__name__)

    app.register_blueprint(shop,url_prefix='/shop')

    app.register_blueprint(admin,url_prefix='/admin')

    @app.route('/')defv_index():

    tpl='''

    • shop
    • admin
    • '''returnrender_template_string(tpl)

      app.run(host='0.0.0.0',port=80)

      ouput:

      5 注册静态目录路由

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

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

      admin = Blueprint("admin",__name__,static_folder='ezstatic')

      app.register_blueprint(admin,url_prefix='/admin')

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

      +------------------------------------------------------------------+

      |  url            | endpoint        | view_function              |

      +------------------------------------------------------------------+

      |  /admin/ezstatic | admin.static    | Blueprint.send_static_file |

      +------------------------------------------------------------------+

      现在就可以使用/admin/ezstatic/访问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')

      这时的路由表如下:

      +------------------------------------------------------------------+

      |  url            | endpoint        | view_function              |

      +------------------------------------------------------------------+

      |  /admin/lib      | admin.static    | Blueprint.send_static_file |

      +------------------------------------------------------------------+

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

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

      推荐阅读更多精彩内容