
蓝图特点
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,Flaskapp = 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 Flaskfrom blueprints import index_pageapp = 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 Blueprintindex_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 Blueprintusers = Blueprint('my_bp',__name__)# 这里把视图函数引入,或者干脆写在这个文件中,放在最后面可以放置循环引用from .import view1
app1/view1.py
@bp.route('/')def index():return "user page"
app.py
xxxx#上面是正常的代码# 这里引入bp蓝图对象from users import usersapp.register_blueprint(bp,url_prefix='/mybp')
蓝图目录拆分
不建议把web项目分割很多蓝图文件,例如user.py,product.py,可以根据类型分割,例如api、cms、web,分别创建文件夹,然后在这些文件夹下创建蓝图。
