flask运行web程序的运行是经过实例化对象app.run()来运行的,那么会出如今一个.py文件里面定义不少的视图函数,即不方便代码管理,又不利于后期的维护.因此在flask出现了蓝图(Blueprint),可使程序模块化,就像django的一个个模块同样来独立编程。那么这个蓝图(Blueprint)就实现了这个功能。
简单来讲,Blueprint 是一个存储操做方法的容器,这些操做在这个Blueprint 被注册到一个应用以后就能够被调用,Flask 能够经过Blueprint来组织URL以及处理请求。Flask使用Blueprint让应用实现模块化。web
一个应用能够具备多个Blueprint
能够将一个Blueprint注册到任何一个未使用的URL下好比 “/”、“/sample”或者子域名
在一个应用中,一个模块能够注册屡次
Blueprint能够单独具备本身的模板、静态文件或者其它的通用操做方法,它并非必需要实现应用的视图和函数的
在一个应用初始化时,就应该要注册须要使用的Blueprint
可是一个Blueprint并非一个完整的应用,它不能独立于应用运行,而必需要注册到某一个应用中。django
蓝图是保存了一组未来能够在应用对象上执行的操做,注册路由就是一种操做
当在应用对象上调用 route 装饰器注册路由时,这个操做将修改对象的url_map路由表
然而,蓝图对象根本没有路由表,当咱们在蓝图对象上调用route装饰器注册路由时,它只是在内部的一个延迟操做记录列表defered_functions中添加了一个项
当执行应用对象的 register_blueprint() 方法时,应用对象将从蓝图对象的 defered_functions 列表中取出每一项,并以自身做为参数执行该匿名函数,即调用应用对象的 add_url_rule() 方法,这将真正的修改应用对象的路由表。编程
当咱们在应用对象上注册一个蓝图时,能够指定一个url_prefix关键字参数(这个参数默认是/)
在应用最终的路由表 url_map中,在蓝图上注册的路由URL自动被加上了这个前缀,这个能够保证在多个蓝图中使用相同的URL规则而不会最终引发冲突,只要在注册蓝图时将不一样的蓝图挂接到不一样的自路径便可。flask
和应用对象不一样,蓝图对象建立时不会默认注册静态目录的路由。须要咱们在 建立时指定 static_folder 参数。
下面的示例将蓝图所在目录下的static_admin目录设置为静态目录app
admin = Blueprint("admin",__name__,static_folder='static_admin') app.register_blueprint(admin,url_prefix='/admin')
如今就可使用/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')
蓝图对象默认的模板目录为系统的模版目录,能够在建立蓝图对象时使用 template_folder 关键字参数设置模板目录函数
admin = Blueprint('admin',__name__,template_folder='my_templates')
注:若是在templates中存在和my_templates同名文件,则系统会优先使用templates中的文件,在使用templates目录同名的状况下,须要经过路径区分,例如:url
my_templates存在两个,若使用admin目录下的my_templates目录,则须要使用以下方式注册:code
admin = Blueprint('admin',__name__,template_folder='admin/my_templates')