1、蓝图的简介及简单应用

在开发一个较大的项目时,其所需要实现的功能往往是十分复杂的,此时在一个文件中完成这些功能,会使得代码非常臃肿,此时蓝图的作用就是将功能进行模块化,更加易于分工并且使代码结构合理化
Blueprint()的相关属性

  1. def __init__(
  2. self,
  3. name,
  4. import_name,
  5. static_folder=None,
  6. static_url_path=None,
  7. template_folder=None,
  8. url_prefix=None,
  9. subdomain=None,
  10. url_defaults=None,
  11. root_path=None,
  12. cli_group=_sentinel,
  13. ):
  14. # rl_prefix前缀

注意要点:

  • 蓝图存放的文件夹默认为blueprints与之前的templates以及static是同一个道理,修改方法类似
  • 在写完一个蓝图文件时,需要在主文件中要进行导入与注册,其URL路径才能被访问
  • 导入蓝图文件的方式,from 路径名.文件名前缀 import 项目名(from blueprints .news import news_bp)
  • 注册蓝图中的项目名,当前文件项目名.register_blueprint(导入的项目名)(app.register_blueprint(news_bp))

一个小例子:
通过蓝图完成,新闻、图书模块的分工
1、创建文件:
image.png
2、news.py文件

  1. # 从flask中导入Blueprint
  2. from flask import Blueprint
  3. # 创建news_bp项目
  4. news_bp = Blueprint('news', __name__)
  5. @news_bp.route("/news/")
  6. def news():
  7. return "新闻中心"
  8. # 在蓝图文件中不需要进行执行,只有通过app.register_blueprint(news_bp)进行注册时,才能进行访问

3、books.py文件

  1. from flask import Blueprint
  2. books_bp = Blueprint("books", __name__)
  3. @books_bp.route("/books/")
  4. def books():
  5. return "图书中心"

4、dome_blueprint.py文件

  1. from flask import Flask
  2. # 从blueprints.文件名导入你命名的项目名
  3. from blueprints.news import news_bp
  4. from blueprints.books import books_bp
  5. app = Flask(__name__)
  6. app.config["TEMPLATES_AUTO_RELOAD"] = True
  7. # 通过app.register_blueprint方法将你命名的项目名进行注册
  8. app.register_blueprint(news_bp)
  9. app.register_blueprint(books_bp)
  10. @app.route('/')
  11. def home():
  12. return "首页"
  13. if __name__ == "__main__":
  14. app.run(debug=True)

2、url_prefix参数的说明

这个参数定义的是前缀

  1. # 写法一:不添加url_prefix参数
  2. from flask import Blueprint
  3. books_bp = Blueprint("books", __name__)
  4. @books_bp.route("/books/")
  5. def books():
  6. return "图书中心"
  1. # 写法二:添加url_prefix参数
  2. from flask import Blueprint
  3. books_bp = Blueprint("books", __name__, url_prefix="/books")
  4. # /books + / --> /books/
  5. @books_bp.route("/")
  6. def books():
  7. return "图书中心"

写法一与写法二最终呈现的效果是一致的,url_prefix参数的作用是给你写的url前面加上指定的前缀,如写法二中定义了url_prefix参数,其作用就是完成/book这个前缀与自己定义的URL”/“的拼接
其作用是使代码更加的简洁,在所有路由的前缀都相同时可以考虑使用

3、蓝图中模板文件的加载

蓝图(Blueprint)中模板文件的加载与之前Flask中模板文件的加载是差不多的,都是通过render_template()方法来进行加载的,但是会有几个注意点。
1、创建的templates(默认文件夹名)文件夹与blueprints文件夹的目录等级相同
image.png
2、template_folder=’路径’的相关说明

  • 通过template_folder重新选择目录存放模板文件,此文件夹要在blueprints文件夹的下一级

    1. news_bp = Blueprint('news', __name__, template_folder="blue_templates")

    image.png
    3、加载模板文件的优先级

  • 如果存在templates文件夹,那么会优先在templates文件夹中寻找

  • 如果templates文件夹中没有所需文件,并且已经通过定义template_folder参数在blueprints文件夹创建了新的路径,此时在新定义的路径中寻找所需模板文件。(换而言之,templates文件夹和自己定义的文件夹中存在同名文件时,用的是templates文件夹中的模板文件)

**

4、蓝图中静态资源文件的加载

静态资源文件的加载时的注意事项

  • 当创建static默认文件夹时,其与存放蓝图的文件夹应当处于同一级别目录

image.png

  • 通过static_folder定义了新的目录时,新的目录应当存在于存放蓝图文件的主目录下级(在这里存放蓝图文件的文件夹时blueprints目录)
  • 通过static_url_path属性写入当前的在blueprint文件夹中static文件夹的路径
  • 通过static_folder=”static”,确定名字(这里必须是static)

    1. news_bp = Blueprint('news', __name__, static_folder="static"static_url_path="/blueprints/static")

    image.png
    **

  • 在模板中导入静态资源文件的注意点:

image.png
1、导入css文件的写法,如果是之前在Flask中导入的写法
<link rel=”stylesheet” href=”{{ url_for(**‘static’**, filename=’css/make.css’) }}”>
那就只能够访问static默认文件夹,即使你在蓝图主文件夹下通过static_folder参数定义了新的文件夹路径,也无法被访问到

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <link rel="stylesheet" href="{{ url_for('static', filename='css/make.css') }}">
  7. </head>
  8. <body>
  9. <p>这是templates文件夹</p>
  10. </body>
  11. </html>

2通过当前蓝图py文件名前缀 . static_folder重新定义路径可以使自定义的文件夹能够被访问到
<link rel=”stylesheet” href=”{{ url_for(‘**news.static**’, filename=’css/make.css’) }}”>
此时即使有定义static默认文件夹,也只会去蓝图主文件夹下去寻找自己定义存放静态资源文件的目录,而不会去访问static默认文件夹

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <link rel="stylesheet" href="{{ url_for('static', filename='css/make.css') }}">
  7. </head>
  8. <body>
  9. <p>这是templates文件夹</p>
  10. </body>
  11. </html>

5、蓝图文件的url_for

对比加载静态资源文件记忆:
在加载蓝图中通过static_folder重命名的文件夹时,使用的是py文件的前缀名
image.png

  1. <link rel="stylesheet" href="{{ url_for('news.static', filename='css/make.css') }}">

在通过urlfor反转获取蓝图文件中的相关URL地址时,是通过Blueprint函数定义的name参数来进行获取的
newsbp = Blueprint(‘news’, __name
)

  1. news_bp = Blueprint('news', __name__)

获取方法:
url_for(定义的name参数值.相关的方法名或者类名)

  1. print(url_for("news.home"))

注意:该用法在蓝图或者Flask中都成立