十一、蓝图(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

 

posted @ 2020-07-29 22:19  找回失去的自我  阅读(410)  评论(0编辑  收藏  举报