在实际的项目开发中,需要实现的功能是很多的,通常来说一个功能至少需要一个视图函数,代码量比较大。
如果将所有视图函数都写在同一个 py 文件中,功能没有问题,但是在维护时非常不方便,没有哪个项目会采用这种方式来写代码。
通常,会根据不同的功能模块,将视图函数写在不同的 py 文件中,这就需要使用到 Flask 中的蓝图 Blueprint 。
一、蓝图 Blueprint 简介
如果只是物理上直接将代码分到不同的 py 文件,是没有办法实现功能的,代码都跑不通。
但代码肯定是要分开的,只是不能简单地将代码分到不同文件,需要使用 Flask 中特有的方式进行模块化处理,Flask 内置了一个模块化处理类 Blueprint 。
Blueprint 是一个存储操作方法(视图函数)的容器(文件),将 Blueprint 注册到一个应用 app 之后, 这个 Blueprint 中的操作方法就可以被 app 调用,Flask 可以通过 Blueprint 来处理请求和返回响应。
一个应用 app 可以有多个 Blueprint ,所以可以将不同功能模块的代码写到不同的蓝图中,然后将蓝图注册到 app 中。
app 调用蓝图是通过 url 来调用的,可以将一个 Blueprint 注册到任何一个未使用的 url 下,注册后,访问该 url 就会访问到对应蓝图。
Blueprint 可以单独具有自己的模板文件、静态文件或者其它的通用操作方法,也可以使用主应用的模板文件和静态文件。
但是,Blueprint 并不是一个完整的应用,它不能独立运行,而是必须注册到某一个应用中,然后被应用调用。
二、使用蓝图
1. 先实现 Flask 的主应用。
在项目文件夹下创建一个 app.py 文件,然后实现最简单的 Flask 后端服务。
代码语言:javascript复制from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello Flask!'
if __name__ == '__main__':
app.run()
运行 app.py ,访问 http://127.0.0.1:5000/ ,前端只会显示一句话:Hello Flask!
2. 创建蓝图对象并实现视图函数
在项目文件夹下创建一个 blue_one 文件夹,然后在 blue_one 目录下创建一个 views.py 文件。在 views.py 中创建一个蓝图对象,并使用蓝图对象来实现相关的视图函数。
代码语言:javascript复制from flask import Blueprint
blue_one = Blueprint('blue', __name__)
@blue_one.route('/')
def blue_func():
return 'Hello Blueprint!'
3. 将蓝图对象注册到 Flask 主应用中
回到 Flask 主应用 app.py 中,将刚才在 views.py 中注册的蓝图对象导入,并将蓝图对象注册到主应用 app 中。
代码语言:javascript复制from flask import Flask
from blue_one.views import blue_one
app = Flask(__name__)
app.register_blueprint(blue_one, url_prefix='/blue_one')
@app.route('/')
def index():
return 'Hello Flask!'
if __name__ == '__main__':
app.run()
使用 app 应用的 register_blueprint() 方法将蓝图对象注册到主应用中。
使用 url_prefix 给蓝图中的所有视图函数指定统一的 url 前缀,在访问这个蓝图中的视图函数时, url 都要在前面拼上此前缀。
非常推荐使用 url_prefix ,因为在应用最终的路由表 url_map 中,蓝图的 url 会自动加上这个前缀,这可以保证多个蓝图中使用相同的 url 也不会引起冲突。
完成上面的代码后,重新运行 app.py ,在前端访问 http://127.0.0.1:5000/blue_one/ ,前端显示:Hello Blueprint! ,这说明已经访问到了蓝图中的视图函数 blue_func() 。
实现蓝图后,可以继续在此蓝图中添加同一归类的视图函数,需要其他蓝图时可以使用相同的方法继续创建蓝图,这样整个项目就实现了模块化管理。
三、蓝图的模板文件目录
蓝图的模板文件目录默认与主应用相同,也可以设置单独的模板文件目录。
建议单独设置,因为项目后端代码已经模块化管理了,模板文件也不少,也与蓝图一起独立出来,维护的时候会方便很多。
1. 创建模板文件夹和模板文件
在 blue_one 文件夹下创建一个 blue_templates 文件夹,然后右键点击文件夹,在 PyCharm 中将该文件夹设置成一个模板文件夹,在 blue_templates 中创建一个 blue_one.html 模板文件。
代码语言:javascript复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Blueprint</title>
</head>
<body>
<p style="color: blue"> Hello Blueprint ! </p>
</body>
</html>
2. 设置蓝图的模板文件
代码语言:javascript复制blue_one = Blueprint('blue', __name__, template_folder='blue_templates')
在 views.py 中注册蓝图时,通过 template_folder 指定该蓝图对应的模板文件目录。
3. 视图函数返回模板文件
在 views.py 中,增加一个视图函数。
代码语言:javascript复制@blue_one.route('/temp')
def blue_temp():
return render_template('blue_one.html')
先导入 render_template() 方法,然后在新增的视图函数中返回刚才创建的模板文件 blue_one.html 。指定 template_folder 后,视图函数 blue_temp() 会自动去 blue_templates 中找模板文件,而不是去主应用的模板文件夹 templates 中找。
重新运行 app.py ,在前端访问 http://127.0.0.1:5000/blue_one/temp ,前端页面如下:
这样,可以成功将蓝图的模板文件独立出来,放在单独的文件目录中。