你真的懂Flask中浅谈蓝图Blueprint吗?
一,什么是Flask中的蓝图Blueprint
- Blueprint是用于实现Flask框架中单个应用的视图,模板,静态文件的集合。
- Blueprint 是一个存储操作(路由映射)方法的容器,这些操作在这个Blueprint 被注册到一个应用之后就可以被调用,Flask 可以通过Blueprint来组织URL以及处理请求(其实就是实现客户端的请求和URL相互关联的功能)。
- 也可以说,Blueprint就是模块化处理的类(但这个说法太笼统)。因为在Flask中使用Blueprint可以让应用实现模块化,并没有体现出类的实质(类的实质就是一种数据类型)。
二,为什么要使用蓝图
随着我们业务代码的增加,会促使我们将所有的代码都放到单个程序文件中,这样会让代码阅读变得困难,给后期维护带来麻烦。
举栗子:
你的笔记本电脑有:USB、电源接⼝口、SD卡槽、⽿耳机孔、 HDMI等; 而我的电脑,就只有一个typeC 口(蓝图接口),其他的接口只能通过type-C的扩展坞(在蓝图中添加url规则)再接 到电脑上(注册蓝图)。我下班了,直接拔了那⼀根type-C走人就可以(其实就是取消注册蓝图),而你还要拔四-五根线,这时候你就发现了这根type-C的⽅便,甚⾄当大家某个外接设备一起出问题(业务逻辑需要修改)时,而我只需要在外接设备与那个拓展坞(蓝图中)之间修复,基本上没电脑主程序什么事,因为它降低了其他外接设备与电脑的耦合。
三,怎么样使用蓝图
1,创建蓝图对象
admin=Blueprint('admin' ,__name__)
2.注册蓝图路由
@admin.route('/')
2 def admin_home():
3 return 'admin_home'
3. 注册蓝图
app.register_blueprint(admin, url_prefix='admin')
当我们这个应用启动后,通过/admin/可以访问到蓝图中定义的视图函数
四, 注意事项
1,蓝图的运行机制:
a,蓝图是封装好一个将来可以在应用对象上执行的操作,注册路由就是一种操作
b,当在应用对象上调用 @xx.route 装饰器注册路由时,这个操作将修改对象的url_map路由表
c,基于b点,大家以为蓝图对象会有路由表。然而,蓝图对象根本没有路由表,当我们在蓝图对象上调用@xx.routeroute装饰器注册路由时,它只是在内部的一个延迟操作记录列表defered_functions中添加了一个项
d,当执行应用对象的 register_blueprint() 方法时,应用对象将从蓝图对象的 defered_functions 列表中取出每一项,并以自身作为参数执行该匿名函数,即调用应用对象的 add_url_rule() 方法,这将真正的修改应用对象的路由表
2,蓝图Blueprint的属性:
a,一个应用可以具有多个Blueprint
b,可以将一个Blueprint注册到任何一个未使用的URL下,比如 “/”、“/sample”或者子域名
c,在一个应用中,一个模块可以注册多次
d,Blueprint可以单独具有自己的模板、静态文件或者其它的通用操作方法,它并不是必须要实现应用的视图和函数的
e,在一个应用初始化时,就应该要注册需要使用的Blueprint
注意:一个Blueprint并不是一个完整的应用,它不能独立于应用运行,而必须要注册到某一个应用中。
3,蓝图的URL前缀:
当我们在应用对象上注册一个蓝图时,可以指定一个url_prefix关键字参数(这个参数默认是/)
在应用最终的路由表 url_map中,在蓝图上注册的路由URL自动被加上了这个前缀,这个可以保证在多个蓝图中使用相同的URL规则而不会最终引起冲突,只要在注册蓝图时将不同的蓝图挂接到不同的自路径即可
url_for('admin.index') # /admin/
4,注册静态路由:
a,与应用对象不同,蓝图对象创建时不会默认注册静态目录的路由。
所以需要我们在 创建时指定 static_folder 参数。
以下的示例,将蓝图所在目录下的static_admin目录设置为静态目录
admin = Blueprint("admin",__name__,static_folder='static_admin')
app.register_blueprint(admin,url_prefix='/admin')
b,现在就可以使用/admin/static_admin/ 访问static_admin目录下的静态文件了
定制静态目录URL规则 :可以在创建蓝图对象时使用 static_url_path 来改变静态目录的路由。
下面的示例将为 static_admin 文件夹的路由设置为 /lib
admin = Blueprint("admin",__name__,static_folder='static_admin',static_url_path='/lib')
app.register_blueprint(admin,url_prefix='/admin')
5,设置模板目录:
蓝图对象默认的模板目录为系统的模版目录
可以在创建蓝图对象时使用 template_folder 关键字参数设置模板目录
admin = Blueprint('admin',__name__,template_folder='my_templates')
注意:如果在 templates 中存在和 my_templates 同名文件,则系统会优先使用 templates 中的文件
参考链接:https://stackoverflow.com/questions/7974771/flask-blueprint-template-folder
笔者有话说:以上内容有多处参考,若未标记清楚出处,还望见谅!
浅谈了Flask中的蓝图自我的见解,若有错,还请指出。
你真的懂Flask中浅谈蓝图Blueprint吗?的更多相关文章
- IOS中 浅谈iOS中MVVM的架构设计与团队协作
今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- 在Objective-C中浅谈面向对象
接触面向对象也有一段时间了,当时是通过C++学习的OOP,后来又接触到了PHP和Java.每种OOP的语言在面向对象上或多或少都会有不同的地方,现在在学习OC的面向对象部分,又感觉到OC面向对象的特点 ...
- 从一次异常中浅谈Hibernate的flush机制
摘自http://www.niwozhi.net/demo_c70_i1482.html http://blog.itpub.net/1586/viewspace-829613/ 这是在一次事务提交时 ...
- 你真的懂javascript中的 “this” 吗?
一.前言: 我们知道 "this" 是javascript语言的一个关键字,在编写javascript代码的时候,经常会见到或者用到它. 但是,有一部分开发朋友,对 "t ...
- 在java中浅谈Math类中的常用方法
通过最近的学习,学到了一些的Math类中的常见方法 package org.stm.demo; public class Test { public static void main(String[] ...
- js中浅谈this对象(未补充完整)
什么是this? 1.javascript语言中,一切皆为对象(除了 undefined 和 null 之外),运行环境也是对象,所以函数都是在某个对象之中运行,this就是这个对象(环境). 2.t ...
- flask中的蓝图与红图
内容: 1.flask中的蓝图 2.flask子域名实现 3.flask中的红图 1.flask中的蓝图 一个大型项目中视图比较多,如果仅仅是写在app.py中不方便管理,蓝图就可以做到分功能分目录结 ...
- python 全栈开发,Day120(路由系统, 实例化Flask的参数, 蓝图(BluePrint), before_request after_request)
昨日内容回顾 1.Flask: from flask import Flask app = Flask(__name__) # 从源码中可以看出,Flask集成的run方法是由werkzeug中的ru ...
- Flask_蓝图Blueprint(十四)
什么是蓝图? 蓝图:用于实现单个应用的视图.模板.静态文件的集合. 蓝图就是模块化处理的类. 简单来说,蓝图就是一个存储操作路由映射方法的容器,主要用来实现客户端请求和URL相互关联的功能. 在Fla ...
随机推荐
- IDEA中如何设置自动导包
IDEA跟eclipse还是有一些差别,一些东西要自己去设置,但同时也还是有快捷键的方式来帮助我们 1.如何设置自动导包:如下图所示 点击FIle--->settings 其次还可以通过按快捷键 ...
- 酱油记:GDKOI2018
GDKOI2018,走出机房的第六场考试 DAY0 这一次GDKOI,第一次在广州二中考,第一次住在柏高酒店(住宿条件杠杠的!),晚上就到对面的万达广场吃了顿烤肉,到老师那里开会,然后就回酒店睡了 D ...
- 算法导论————EXKMP
[例题传送门:caioj1461] [EXKMP]最长共同前缀长度 [题意]给出模板串A和子串B,长度分别为lenA和lenB,要求在线性时间内,对于每个A[i](1<=i<=lenA), ...
- 2.AngularJS-验证
转自:https://www.cnblogs.com/best/p/6225621.html 一.验证 angularJS中提供了许多的验证指令,可以轻松的实现验证,只需要在表单元素上添加相应的ng属 ...
- 摄像头驱动——V4L2框架分析
一.概述 Video for Linux 2,简称V4l2,是Linux内核中关于视频设备的内核驱动框架,为上层的访问底层的视频设备提供了统一的接口. 摄像头驱动是属于字符设备驱动程序.(分析linu ...
- 用Shell脚本过滤Hadoop中不能訪问的节点
近期使用的一个集群hp1,由于维护集群的人不给力.节点总是过一段时间就掉一两个.今天发现重新启动hadoop时,HDFS已经进入保护模式了. 决定把slaves节点中的无法訪问的节点所有过滤掉.所以写 ...
- DB2物化视图(Materialized Query Tables, MQT)
DB2的物化视图MQT是基于查询结果定义的一个表,MQT中包括的数据来自MQT定义所基于的一个或多个表, 使用MQT能够显著提高查询的操作性能. 数据库的视图和MQT都是基于一个查询来定义的.每当视图 ...
- java poi操作excel示例代码
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io ...
- 深入理解Android(4)——理解Android中的JNI(下)
在前面文章中简单介绍了JNI,这一篇文章来简单看一下jni.h中定义的一些常用方法,来实现通过C++调用Android中的Java代码. 转载请说明出处:http://blog.csdn.net/da ...
- javaweb三、JDBC访问数据库
JDBC是J2SE的内容,是由java提供的访问数据库的接口,但没有提供具体的实现方法,需要数据库厂商提供,就是对应的数据库驱动. 这样的好处是可以方便的更换数据库,提高了扩展性.这也是面向接口编程的 ...