什么是蓝图?
一个蓝图定义了可用于单个应用的视图、模版、静态文件等等的集合。可以把蓝图当作你的应用的管理面板。
如何使用蓝图?
蓝图的杀手锏是将你的应用组织成不同的组件。假如有一个微博客的项目,我们可能需要一个蓝图作用于此网站页面,然后还需要一个用于管理员面板中展示最新的蓝图消息,以及另一个用于管理员面板的蓝图,最终你将能够把你的应用依据许多能完成单一任务的小应用组织起来。
功能式架构和分区式架构
功能式架构
按照每部分代码的功能来组织应用。将所有的模版、静态文件、视图分别放到三个文件夹;
yourapp/
__init__.py
static/
templates/
home/
control_panel/
admin/
views/
__init__.py
home.py
control_panel.py
admin.py
models.py
在yourapp/views/文件夹中的每一个.py文件都是一个蓝图。
分区式架构
在分区式架构中,按照每一部分所属的蓝图来组织应用。管理面板的所有模版,视图和静态文件放在一个文件夹中,用户控制面板的则放到另一个文件夹中,
yourapp/
__init__.py
admin/
__init__.py
views.py
static/
templates/
home/
__init__.py
views.py
static/
templates/
control_panel/
__init__.py
views.py
static/
templates/
models.py
每一个yourapp之下的文件夹艘是一个独立的蓝图。所有的蓝图通过顶级的**init**.py注册到Flask()中。
如何抉择架构方式?
两者的唯一区别是表达层次性的方式不同。
- 如果你的应用是独立的,仅仅共享模型和配置的各组件组成,分区式将是个不错的选择,一个例子是一个微电影管理系统,包括后台管理和前端管理,后台管理中有包括电影管理、标签管理等等;前端管理包括电影管理,电影评价、电影收藏等。这种情况各个部分之间关系不是很密切,就可以使用分布式架构,每个管理模块都有一个蓝图,如果这个项目需要几个人共同完成,每个人完成几个管理模块,到时候后期总结就显得简单快捷,只需将各个管理模块的蓝图一起注册即可,不需要再进行功能的分析结合。
- 如果你想要将你的蓝图提取插件,或用于别的项目,一个分区式架构将是正确的选择;
- 如果你的应用的组件之间的联系较为紧密,使用功能式架构会更好。
创建一个蓝图
第一步:实例化一个蓝图对象并进行配置
第二步:在主运行程序中注册蓝图对象,使其能够通过配置的路由访问视图
创建一个admin目录
admin/admin_moduel.py
from flask import Blueprint
#创建了蓝图对象‘admin_bp’,它使用起来类似于flask中的app对象,
# 比如可以使用自己的路由admin_bp.route(),初始化Blueprint对象
# 的第一个参数‘admin’指定了这个蓝图得名称,第二个参数指定了该蓝
# 图所在的模块名
admin_bp=Blueprint('admin',__name__)
@admin_bp.route('/')
def index():
return '<h1>hello,this is admin blueprint</h1>'
注册蓝图
from flask import Flask
from admin.admin_module import admin_bp
app=Flask(__name__)
#指定了这个蓝图URL前缀。现在访问http://0.0.0.0:5000/admin/就可以加载
#蓝图的index视图了
app.register_blueprint(admin_bp,url_prefix='/admin')
#debug=True如果为True则在访问时如果出错在页面会显示报错信息
if __name__=='__main__':
app.run(host='0.0.0.0',debug=True)
运行结果
也可以在创建蓝图时指定其URL前缀:
admin_bp=Blueprint('admin',__name__,url_prefix='/admin')
这样注册时就无需指定
app.register_blueprint(admin_bp)
蓝图资源
蓝图有自己的目录,它所有的资源都在其目录下。蓝图的资源是由创建Blueprint对象时传入的模块名“name”所在的位置决定的。同时可以指定蓝图自己的模版和静态目录。
# template_folder='templates',static_folder='static'
#不过默认模版和静态文件目录就是templates和static;当然也可以指定自己创建的目录为该蓝图的默认访问目录
admin_bp=Blueprint('admin',__name__,template_folder='templates',
static_folder='static')
我们可以使用蓝图对象的root_path属性获取其之资源路径,
open_resource()方法访问主资源路径下的某个文件.
print(admin_bp.root_path)
#/home/kiosk/PycharmProjects/Flaskpratice/admin
构建URL
构建URL的方法url_for()。其第一个参数我们称为端点,一般指向视图函数或资源名。蓝图的端点名称都要加上蓝图名为前缀。当我们通过端点名来获取URL时。
from flask import url_for
url_for('admin.index')
url_for('admin.static',filename='style.css')
这样才能获取admin蓝图下视图或资源的URL地址;如果url_for
()函数的调用就在蓝图下,那蓝图名可以忽略,但必须留下’.'表示当前蓝图。
静态或动态的前缀
蓝图允许我们定义静态或动态的前缀。比如:我们可以高告诉Flask蓝图中所有路由应该以/profile作为前缀,这样就是一个静态前缀;如果前缀取决于访问的页面,他们在URL对应片段中输入的文本将决定我们输出的视图,这样是一个动态前缀。
蓝图在国际化中的使用
在国际化站点中,普篇采用的方法是通过URL前缀来区分语言,比如“www.abc.com/cn/”是中文网页,“www.abc.com/en/”式英文网页。