蓝图
1.Blueprint概念
简单来说,Blueprint 是⼀个存储操作⽅法的容器,这些操作在这个Blueprint 被注册到⼀个应⽤之后就可以被调⽤,
Flask 可以通过Blueprint来组织URL以及处理请求。
Flask使⽤Blueprint让应⽤实现模块化,在Flask中,Blueprint具有如下属性:
- ⼀个应⽤可以具有多个Blueprint
- 可以将⼀个Blueprint注册到任何⼀个未使⽤的URL下⽐如 “/”、“/sample”或者⼦域名
- 在⼀个应⽤中,⼀个模块可以注册多次
- Blueprint可以单独具有⾃⼰的模板、静态⽂件或者其它的通⽤操作⽅法,它并不是必须要实现应⽤的视图和函数的
- 在⼀个应⽤初始化时,就应该要注册需要使⽤的Blueprint
但是⼀个Blueprint并不是⼀个完整的应⽤,它不能独⽴于应⽤运⾏,⽽必须要注册到某⼀个应⽤中。
2.蓝图使用
蓝图/Blueprint对象⽤起来和⼀个应⽤/Flask对象差不多,最⼤的区别在于⼀个 蓝图对象没有办法独⽴运⾏,必须将它注册到⼀个应⽤对象上才能⽣效
2.1使⽤蓝图可以分为三个步骤
1,创建⼀个蓝图对象
admin=Blueprint('admin',__name__)
2,在这个蓝图对象上进⾏操作,注册路由,指定静态⽂件夹,注册模版过滤器
@admin.route('/')
def admin_home():
return 'admin_home'
3,在应⽤对象上注册这个蓝图对象
app.register_blueprint(admin,url\_prefix='/admin')
当这个应⽤启动后,通过/admin/可以访问到蓝图中定义的视图函数
2.2运⾏机制
- 蓝图是保存了⼀组将来可以在应⽤对象上执⾏的操作,注册路由就是⼀种操作
- 当在应⽤对象上调⽤ route 装饰器注册路由时,这个操作将修改对象的url_map路由表
- 然⽽,蓝图对象根本没有路由表,当我们在蓝图对象上调⽤route装饰器注册路由时,它只是在内部的⼀个延迟操作记录列表defered_functions中添加了⼀个项
- 当执⾏应⽤对象的 register_blueprint() ⽅法时,应⽤对象将从蓝图对象的 defered_functions 列表中取出每⼀项,并以⾃身作为参数执⾏该匿名函数,即调⽤应⽤对象的 add_url_rule() ⽅法,这将真正的修改应⽤对象的路由表
2.3蓝图的url前缀
- 当我们在应⽤对象上注册⼀个蓝图时,可以指定⼀个url_prefix关键字参数(这个参数默认是/)
- 在应⽤最终的路由表 url_map中,在蓝图上注册的路由URL⾃动被加上了这个前缀,这个可以保证在多个蓝图中使⽤相同的URL规则⽽不会最终引起冲突,只要在注册蓝图时将不同的蓝图挂接到不同的⾃路径即可
- url_for
url_for('admin.index') # /admin/
2.4注册静态路由
和应⽤对象不同,蓝图对象创建时不会默认注册静态⽬录的路由。需要我们在 创建时指定 static_folder 参数。
下⾯的示例将蓝图所在⽬录下的static_admin⽬录设置为静态⽬录
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')
2.5设置模版⽬录
蓝图对象默认的模板⽬录为系统的模版⽬录,可以在创建蓝图对象时使⽤ template_folder 关键字参数设置模板⽬录
admin = Blueprint('admin',__name__,template_folder='my_templates')