蓝图
之前我们写的url和视图函数都是处在同一个文件,如果项目比较大的话,这显然不是一个合理的结构,而蓝图可以优雅的帮我们实现这种需求。
我们在主程序中,通过app.register_blueprint()方法将这个蓝图注册进url映射中,以后访问/user/,/user/profile/,都是执行的user.py文件中的视图函数,这样就实现了项目的模块化。
以上是对蓝图的一个简单介绍,但是使用蓝图还有几个需要注意的地方,就是在蓝图如何寻找静态文件、模板文件,url_for函数如何反转url
寻找静态文件
默认不设置任何静态文件路径,Jinja2会在项目的static文件夹中寻找静态文件。也可以设置其他的路径,在初始化蓝图的时候,Blueprint这个构造函数,有一个参数static_folder可以指定静态文件的路径
static_folder可以是相对路径(相对蓝图文件所在的目录),也可以是绝对路径。在配置完蓝图后,还有一个需要注意的地方是如何在模板中引用静态文件。在模板中引用蓝图,应该要使用蓝图名+.+static来引用
寻找模板文件文件
跟静态文件一样,默认不设置任何模板文件的路径,将会在项目的templates中寻找模板文件。也可以设置其他的路径,在构造函数Blueprint中有一个template_folder参数可以设置模板的路径
模板文件和静态文件有点区别,以上代码写完以后,如果你渲染一个模板return render_template(‘admin.html’),Flask默认会去项目根目录下的templates文件夹中查找admin.html文件,如果找到了就直接返回,如果没有找到,才会去蓝图文件所在的目录下的templates文件夹中寻找。
url_for生成url:
用url_for生成蓝图的url,使用的格式是:蓝图名称+.+视图函数名称。比如要获取admin这个蓝图下的index视图函数的url
其中这个蓝图名称是在创建蓝图的时候,传入的第一个参数。
news.py
# @ Time : 2020/4/17
# @ Author : Ellen
from flask import Blueprint,render_template
# url_prefix 路由是从news/开始的 相对路径
# news_bp = Blueprint('news', __name__, url_prefix="/news/", template_folder='lgcoder')
news_bp = Blueprint('news', __name__, url_prefix="/news/",static_folder='static')
# /news url_prefix / => /news/
@news_bp.route("/")
def news():
# return "新闻首页"
return render_template("news.html")
# 1.寻找templates(优先) 目录下的模板文件,如果有则运行该目录下的模板文件
# 2.如templates不存在,template_follder存在,找在template_folder目录下的模板文件
book.py
from flask import Blueprint, url_for
book_bp = Blueprint('book', __name__, url_prefix="/book/")
@book_bp.route("/")
def book():
print(url_for("book.book_detail", bid=3))
return "图书首页"
@book_bp.route("/detail/<bid>")
def book_detail(bid):
return "图书的ID %s" % bid
templates->news.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- <link rel="stylesheet" href="{{ url_for('static',filename='news.css') }}">-->
<link rel="stylesheet" href="{{ url_for('news.static',filename='news.css') }}">
</head>
<body>
<h1>这是templates中的新闻首页</h1>
</body>
</html>
template_folder->news.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>这是蓝图中的新闻首页</h1>
</body>
</html>