十一、蓝图(Blueprint)
1、蓝图(Blueprint)的作用
1 from flask import Blueprint
(1)帮助划分flask应用程序的目录结构
我们最初学习的flask应用程序都是被写在一个.py文件中的,但是当我们的flask应用程序稍微大一点的时候(包含模板、静态文件等资源),就不太可能使用一个.py文件了,必须要划分目录结构了
简单的目录结构:
account.py
1 from flask import Blueprint 2 from flask import render_template 3 4 5 ac = Blueprint("ac", __name__) 6 7 8 @ac.route("/") 9 def index(): 10 return "account, index" 11 12 13 @ac.route("/login") 14 def login(): 15 return render_template("login.html")
flask_blueprint_pro/flask_blueprint_pro/__init__.py
1 from flask import Flask 2 from .views import account 3 4 5 app = Flask(__name__) 6 app.debug = True 7 8 app.register_blueprint(account.ac)
flask_blueprint_pro/manage.py
1 from flask_blueprint_pro import app 2 3 4 if __name__ == '__main__': 5 app.run("localhost", 80)
要注意的地方:
在哪个文件里面创建Flask的实例对象,那么默认的static_folder和template_folder就默认为当前目录下的static和templates目录,当render_template渲染模板时,就在默认的template目录里面寻找,模板里的静态资源就会在static目录下寻找。
flask_blueprint_pro/manage.py中的导入from flask_blueprint_pro import app的flask_blueprint_pro的前面不能加点,否则python解释器就会认为项目目录是一个包,就会导入失败,出现错误
(2)给url加一个前缀(类似于django里面的主路由分发子路由功能)
account.py
from flask import Blueprint from flask import render_template ac = Blueprint("ac", __name__, url_prefix="/account") @ac.route("/") def index(): return "account, index" @ac.route("/login") def login(): return render_template("login.html")
以后再访问account.py里面的路径时,必须要在前面加上"/account",实现了每个功能通过每个url前缀分隔开,这个不仅可以在实例化Blueprint时传入url_prefix参数,也可以在注册蓝图时传入url_prefix参数
1 from flask import Flask 2 from .views import account 3 4 5 app = Flask(__name__) 6 app.debug = True 7 8 app.register_blueprint(account.ac, url_prefix="/account")
(3)为每一个蓝图(Blueprint提供一个局部的before_request、after_request)before_requst和after_request是被Blueprint的实例化对象使用的,因而只对该蓝图起效
为每一个蓝图提供一个局部的static_folder和template_folder,如果这两个参数被设置了,就会在这两个目录下寻找对应的文件,如果没有被设置或者没有寻找到,就会在全局的static_folder和template_folder目录下寻找,这个就会引出一个更加大型的项目目录结构(每个子应用管理自己的静态文件和模板文件),这样也方便协同开发,每个人完成自己的功能模块。
big_flask_pro/big_flask_pro/__init__.py
1 from flask import Flask 2 3 4 app = Flask(__name__) 5 from . import account 6 from .account import views 7 app.register_blueprint(account.ac)
注意:为什么还要导入from .account import views,这不是显得多余吗?如果执行这句代码,将路由规则和视图函数对应起来的蓝图操作就不会执行,导致访问路径时,提示路径不存在。
2、补充
假如别人交给我们一个项目,到时没有告诉我们需要安装哪些依赖项,我们在将依赖项安装完成之前是启动不了项目,那有什么办法可以自动找出这个项目需要安装的依赖项,而不需要我们一个个去找吗?
pipreqs工具可以帮助我们自动寻找项目依赖
安装:
pip install pipreqs
使用:
pipreqs ./
执行pipreqs ./(./ 表示当前目录下的所有目录及文件),就会在当前目录下生成一个requestments.txt文件(pip freeze > requestments.txt),然后直接安装依赖项就可以了
pip install -r requestments.txt