蓝图特点
Flask中的app可以和Django的project对比
Flask的Blueprint可以和Django的startapp做对比
方便管理视图函数
蓝图很多api和app相同,但是其和app完全不一样。
一个应用可以有多个Blueprint;
每个Blueprint可以注册不同的路由前缀;
Blueprint可以单独具有自己的额模板、静态文件或者其他的通用操作方法,他并不是要实现应用的视图函数;
在一个应用初始化时,需要注册需要使用的Blueprint。
一个Blueprint并不是一个完整的应用,不能独立于应用运行,需要注册到某一个应用中。
Blueprint类构造函数需要有两个必填参数,蓝本的名称和蓝本所在的包或模块【一般为name】
蓝图需要注册到app核心对象中。
创建蓝图
def __init__(self, name, import_name, static_folder=None,
static_url_path=None, template_folder=None,
url_prefix=None, subdomain=None, url_defaults=None,
root_path=None):
最简单的例子
创建一个蓝图对象
第一个参数是蓝图的名字,name标识蓝图内部查找文件的地址为本py文件相关
userbp = Blueprint(‘user’,_name)
在蓝图对象注册路由
@user_bp.route(‘/‘)
def user_profile():
return ‘user_profile’
在应用对象app注册蓝图对象
可以添加相关前缀
app.register(user_bp,prefix=’xxx’)
/learning下的访问都是在蓝图中的,有点类似springmvc的类上的@RequestMapping。
from flask import Blueprint,Flask
app = Flask(__name__)
index_page = Blueprint("index_page",__name__)
@index_page.route('/')
def index():
return "index page"
@index_page.route('/me')
def hello():
return "hello, this is me"
app.register_blueprint(index_page,url_prefix='/learning')
@app.route('/')
def hello():
return "hello, home page"
if __name__ == '__main__':
app.run()
蓝图和app文件分割
但是蓝图文件需要和启动文件进行区分
run.py
from flask import Flask
from blueprints import index_page
app = Flask(__name__)
# 将蓝图注册到核心配置中
app.register_blueprint(index_page,url_prefix='/learning')
@app.route('/')
def hello():
return "hello, home page"
if __name__ == '__main__':
app.run(debug=True)
蓝图blueprints.py:
from flask import Blueprint
index_page = Blueprint("index_page",__name__)
@index_page.route('/')
def index():
return "index page"
@index_page.route('/me')
def hello():
return "hello, this is me"
访问127.0.0.1:5000/learrning就是返回”index page”,127.0.0.1:5000/learrning/me就是返回”hello, this is me”
蓝图在目录中
如果是将蓝图文件放在一个目录bps中,例如init.py文件中定义蓝图对象,在view.py中定义视图函数,需要在应用对象文件中引入对象
bps/init.py
文件目录
— app.py
— users
— init.py
— view1
from flask import Blueprint
users = Blueprint('my_bp',__name__)
# 这里把视图函数引入,或者干脆写在这个文件中,放在最后面可以放置循环引用
from .import view1
app1/view1.py
@bp.route('/')
def index():
return "user page"
app.py
xxxx
#上面是正常的代码
# 这里引入bp蓝图对象
from users import users
app.register_blueprint(bp,url_prefix='/mybp')
蓝图目录拆分
不建议把web项目分割很多蓝图文件,例如user.py,product.py,可以根据类型分割,例如api、cms、web,分别创建文件夹,然后在这些文件夹下创建蓝图。