1、蓝图的简介及简单应用
在开发一个较大的项目时,其所需要实现的功能往往是十分复杂的,此时在一个文件中完成这些功能,会使得代码非常臃肿,此时蓝图的作用就是将功能进行模块化,更加易于分工并且使代码结构合理化
Blueprint()的相关属性
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,
cli_group=_sentinel,
):
# rl_prefix前缀
注意要点:
- 蓝图存放的文件夹默认为blueprints与之前的templates以及static是同一个道理,修改方法类似
- 在写完一个蓝图文件时,需要在主文件中要进行导入与注册,其URL路径才能被访问
- 导入蓝图文件的方式,from 路径名.文件名前缀 import 项目名(from blueprints .news import news_bp)
- 注册蓝图中的项目名,当前文件项目名.register_blueprint(导入的项目名)(app.register_blueprint(news_bp))
一个小例子:
通过蓝图完成,新闻、图书模块的分工
1、创建文件:
2、news.py文件
# 从flask中导入Blueprint
from flask import Blueprint
# 创建news_bp项目
news_bp = Blueprint('news', __name__)
@news_bp.route("/news/")
def news():
return "新闻中心"
# 在蓝图文件中不需要进行执行,只有通过app.register_blueprint(news_bp)进行注册时,才能进行访问
3、books.py文件
from flask import Blueprint
books_bp = Blueprint("books", __name__)
@books_bp.route("/books/")
def books():
return "图书中心"
4、dome_blueprint.py文件
from flask import Flask
# 从blueprints.文件名导入你命名的项目名
from blueprints.news import news_bp
from blueprints.books import books_bp
app = Flask(__name__)
app.config["TEMPLATES_AUTO_RELOAD"] = True
# 通过app.register_blueprint方法将你命名的项目名进行注册
app.register_blueprint(news_bp)
app.register_blueprint(books_bp)
@app.route('/')
def home():
return "首页"
if __name__ == "__main__":
app.run(debug=True)
2、url_prefix参数的说明
这个参数定义的是前缀
# 写法一:不添加url_prefix参数
from flask import Blueprint
books_bp = Blueprint("books", __name__)
@books_bp.route("/books/")
def books():
return "图书中心"
# 写法二:添加url_prefix参数
from flask import Blueprint
books_bp = Blueprint("books", __name__, url_prefix="/books")
# /books + / --> /books/
@books_bp.route("/")
def books():
return "图书中心"
写法一与写法二最终呈现的效果是一致的,url_prefix参数的作用是给你写的url前面加上指定的前缀,如写法二中定义了url_prefix参数,其作用就是完成/book这个前缀与自己定义的URL”/“的拼接
其作用是使代码更加的简洁,在所有路由的前缀都相同时可以考虑使用
3、蓝图中模板文件的加载
蓝图(Blueprint)中模板文件的加载与之前Flask中模板文件的加载是差不多的,都是通过render_template()方法来进行加载的,但是会有几个注意点。
1、创建的templates(默认文件夹名)文件夹与blueprints文件夹的目录等级相同
2、template_folder=’路径’的相关说明
通过template_folder重新选择目录存放模板文件,此文件夹要在blueprints文件夹的下一级
news_bp = Blueprint('news', __name__, template_folder="blue_templates")
3、加载模板文件的优先级如果存在templates文件夹,那么会优先在templates文件夹中寻找
- 如果templates文件夹中没有所需文件,并且已经通过定义template_folder参数在blueprints文件夹创建了新的路径,此时在新定义的路径中寻找所需模板文件。(换而言之,templates文件夹和自己定义的文件夹中存在同名文件时,用的是templates文件夹中的模板文件)
4、蓝图中静态资源文件的加载
静态资源文件的加载时的注意事项
- 当创建static默认文件夹时,其与存放蓝图的文件夹应当处于同一级别目录
- 通过static_folder定义了新的目录时,新的目录应当存在于存放蓝图文件的主目录下级(在这里存放蓝图文件的文件夹时blueprints目录)
- 通过static_url_path属性写入当前的在blueprint文件夹中static文件夹的路径
通过static_folder=”static”,确定名字(这里必须是static)
news_bp = Blueprint('news', __name__, static_folder="static",static_url_path="/blueprints/static")
**在模板中导入静态资源文件的注意点:
1、导入css文件的写法,如果是之前在Flask中导入的写法
<link rel=”stylesheet” href=”{{ url_for(**‘static’**, filename=’css/make.css’) }}”>
那就只能够访问static默认文件夹,即使你在蓝图主文件夹下通过static_folder参数定义了新的文件夹路径,也无法被访问到
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/make.css') }}">
</head>
<body>
<p>这是templates文件夹</p>
</body>
</html>
2、通过当前蓝图py文件名前缀 . static_folder重新定义路径可以使自定义的文件夹能够被访问到
<link rel=”stylesheet” href=”{{ url_for(‘**news.static**’, filename=’css/make.css’) }}”>
此时即使有定义static默认文件夹,也只会去蓝图主文件夹下去寻找自己定义存放静态资源文件的目录,而不会去访问static默认文件夹
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/make.css') }}">
</head>
<body>
<p>这是templates文件夹</p>
</body>
</html>
5、蓝图文件的url_for
对比加载静态资源文件记忆:
在加载蓝图中通过static_folder重命名的文件夹时,使用的是py文件的前缀名
<link rel="stylesheet" href="{{ url_for('news.static', filename='css/make.css') }}">
在通过urlfor反转获取蓝图文件中的相关URL地址时,是通过Blueprint函数定义的name参数来进行获取的
newsbp = Blueprint(‘news’, __name)
news_bp = Blueprint('news', __name__)
获取方法:
url_for(定义的name参数值.相关的方法名或者类名)
print(url_for("news.home"))
注意:该用法在蓝图或者Flask中都成立