blueprint把不同功能的module分开。可以让应用模块化,针对大型应用。
蓝图的基本概念:在蓝图被注册到应用之后,所要执行的操作的集合。当分配请求时, Flask 会把蓝图和视图函数关联起来,并生成两个端点之前的 URL 。
比如只有一个run.py。有些功能需要多人分开来写,有些功能会有交错的可能,代码位置也不会在一起,这样可以用蓝图来开关一些模块(功能)和宏定义类似,但不是可插拔的应用而是一套可以注册在应用中的操作,并且可以注册多次。或者简单滴需要降低耦合,提高模块复用率。比如开发环境和应用环境的不同,可以用蓝图来切换环境。
蓝图的缺点是一旦应用被创建后,只有销毁整个应用对象才能注销蓝图。
下面是一个最精简的例子:
├── my_flasky
├── app
├── __init__.py
└── main
├── __init__.py
└── views.py
└── manage.py
==================================================================
my_flasky/app/__init__.py
#encoding:utf8
from flask import Flask
def create_app():
app = Flask(__name__)
#从/main/__init__.py中获取蓝图,并注册蓝图
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
return app
=================================================
my_flasky/app/main/__init__.py
#encoding:utf8
from flask import Blueprint
main = Blueprint('main',__name__) #main为蓝本名称,__name__为蓝图所在的模块或者包
#切记最后再导入main文件包下的模块,以防止循环导入报错
from . import views
=================================================================
my_flasky/app/main/views.py
#encoding:utf8
from . import main #导入蓝图
@main.route('/')
def index():
return '我的蓝图
'
====================================================================
my_flasky/manage.py
#encoding:utf8
from app import create_app
app = create_app()
if __name__ == '__main__':
app.run(host='0.0.0.0',port=80,debug=True)
本例实现了一个最简单的flask示例,它实现的功能和以下代码一样:
#encoding:utf8
from flask import Flask
app = Flask(__name__)
def index():
return '我的蓝图
'
if __name__ == '__main__':
app.run()
这个确实简单的不是一丁点,但是为什么要写成上面的格式呢?
对于简单的例子或许看不出来,但是稍微复杂一点的flask应用肯定不是一个人能完成的,所以就需要分工,一人负责一块,而Blueprint就是负责组装它们的,实现模块化管理,要想学好flask这东西肯定是绕不过去的。
实现过程(以例一为例):1,在视图模块所在的包(main)内创建蓝本,并将所有的视图模块(views.py)导入;2,在存放视图模块包的目录下(app)构造create_app函数,在函数里完成蓝本的注册,可以注册多个;3,在根目录(my_flasky)中通过调用2中构造的函数创建启动脚本(manage.py)。
大概就是这样:
views.py(可以多个)—>main(可以多个)—>app(就一个)—>manage.py