image.png

蓝图特点

Flask中的app可以和Django的project对比
Flask的Blueprint可以和Django的startapp做对比

方便管理视图函数

蓝图很多api和app相同,但是其和app完全不一样。

一个应用可以有多个Blueprint;
每个Blueprint可以注册不同的路由前缀;
Blueprint可以单独具有自己的额模板、静态文件或者其他的通用操作方法,他并不是要实现应用的视图函数;
在一个应用初始化时,需要注册需要使用的Blueprint。

一个Blueprint并不是一个完整的应用,不能独立于应用运行,需要注册到某一个应用中。

Blueprint类构造函数需要有两个必填参数,蓝本的名称和蓝本所在的包或模块【一般为name
蓝图需要注册到app核心对象中。

创建蓝图

  1. def __init__(self, name, import_name, static_folder=None,
  2. static_url_path=None, template_folder=None,
  3. url_prefix=None, subdomain=None, url_defaults=None,
  4. 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。

  1. from flask import Blueprint,Flask
  2. app = Flask(__name__)
  3. index_page = Blueprint("index_page",__name__)
  4. @index_page.route('/')
  5. def index():
  6. return "index page"
  7. @index_page.route('/me')
  8. def hello():
  9. return "hello, this is me"
  10. app.register_blueprint(index_page,url_prefix='/learning')
  11. @app.route('/')
  12. def hello():
  13. return "hello, home page"
  14. if __name__ == '__main__':
  15. app.run()

蓝图和app文件分割

但是蓝图文件需要和启动文件进行区分
run.py

  1. from flask import Flask
  2. from blueprints import index_page
  3. app = Flask(__name__)
  4. # 将蓝图注册到核心配置中
  5. app.register_blueprint(index_page,url_prefix='/learning')
  6. @app.route('/')
  7. def hello():
  8. return "hello, home page"
  9. if __name__ == '__main__':
  10. app.run(debug=True)

蓝图blueprints.py:

  1. from flask import Blueprint
  2. index_page = Blueprint("index_page",__name__)
  3. @index_page.route('/')
  4. def index():
  5. return "index page"
  6. @index_page.route('/me')
  7. def hello():
  8. 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

  1. from flask import Blueprint
  2. users = Blueprint('my_bp',__name__)
  3. # 这里把视图函数引入,或者干脆写在这个文件中,放在最后面可以放置循环引用
  4. from .import view1

app1/view1.py

  1. @bp.route('/')
  2. def index():
  3. return "user page"

app.py

  1. xxxx
  2. #上面是正常的代码
  3. # 这里引入bp蓝图对象
  4. from users import users
  5. app.register_blueprint(bp,url_prefix='/mybp')

蓝图目录拆分

不建议把web项目分割很多蓝图文件,例如user.py,product.py,可以根据类型分割,例如api、cms、web,分别创建文件夹,然后在这些文件夹下创建蓝图。