蓝图

现在所有的视图函数都是写在app.py文件中,随着项目越来越复杂,这种写法会导致app.py文件越来越臃肿,大幅地提高了后期项目维护的成本。对于一个商业项目而言,我们应该把代码进行模块化,蓝图就是为此而生的。我们以豆瓣网为例,豆瓣网目前有几个模块,分别为读书、电影、音乐、同城、小组、阅读等。每个模块都可以用一个蓝图来实现,最终在app中统一注册所有的蓝图,可以让项目结构更加清晰有序。下面对蓝图的使用进行讲解。

基本使用

这里以用户模块为例,注册一个蓝图,示例代码如下。

from flask import Blueprint

bp = Blueprint('user', __name__, url_prefix='/user')

@bp.route('/list')
def user_list():
    return "用户列表"

@bp.route('/profile/<user_id>')
def user_profile(user_id):
    return "用户简介"

以上代码中,首先从flask中导入了Blueprint类,然后使用该类初始化一个对象,在初始化这个对象时传递了3个参数,3个参数的说明如下。

  • 蓝图名称:第1个参数是蓝图的名称,在使用url_for反转蓝图中的某个视图时,需要用到蓝图名.视图名,如反转user_list,则代码为url_for("user.user_list")。

  • 模块名:第2个参数是模块名,一般设置为 __name__,用于寻找模板文件和静态文件。

  • URL前缀:第3个参数是URL前缀,以后访问这个蓝图的所有URL,都必须加上 /user 前缀,如获取用户列表的URL为 /user/list。

蓝图注册完成后,还需要在Flask对象app中进行注册,示例代码如下。

from user import bp as user_bp
...
app.register_blueprint(user_bp)

寻找模板

在蓝图中渲染模板,默认会从项目根路径下的templates文件夹中寻找。如果想要更换寻找路径,可以在初始化Blueprint对象时,通过传递template_folder参数实现,示例代码如下。

bp=Blueprint('user',__name__,url_prefix='/user',template_folder='templates')

这样以后在渲染模板文件时,如 return render_template("user.html"),默认就会从项目的根路径下的 templates 文件夹中寻找 user.html,如果没有找到,则再从蓝图所在的文件夹下的 templates 文件夹中寻找。

寻找静态文件

默认是不设置任何静态文件路径的,Jinja2会在项目根路径下的static文件夹中寻找静态文件。在初始化Blueprint对象时,通过static_folder参数可以指定静态文件的路径,示例代码如下。

bp=Blueprint('user',__name__,url_prefix='/user,static_folder='static')

static_folder 可以是相对路径(相对蓝图文件所在的目录),也可以是绝对路径。在配置完蓝图后,还需要注意如何在模板中引用静态文件。在模板中引用蓝图,应该使用蓝图名 +.+static 的格式来引用,示例代码如下。

<link href="{{ url_for('user.static',filename='about.css') }}">