Flask之蓝图(BluePrint)

1,208 阅读3分钟

这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战

Flask蓝图介绍

蓝图是Flask提供的一个类,其具备Flask核心对象的很多功能,最重要的就是注册路由,通过Flask的蓝图,我们可以把整个项目分成不同的模块并在不同的模块中增加不同的功能。可以在一个应用或跨越多个项目共用蓝图。使用蓝图可以简化大型项目的开发难度,也为Flask扩展了一种在应用中注册服务的集中式机制。

蓝图的应用场景

把一个应用分解为一个蓝图的集合。这对大型应用是理想的。一个项目可以实例化一个应用对象,初始化几个扩展,并注册一集合的蓝图。

以URL前缀和/或子域名,在应用上注册一个蓝图。URL前缀/子域名中的参数即成为这个蓝图下的所有视图函数的共同的视图参数(默认情况下) 在一个应用中用不同的URL规则多次注册一个蓝图。

通过蓝图提供模板过滤器、静态文件、模板和其他功能。一个蓝图不一定要实现应用或视图函数。

初始化一个Flask扩展时,在这些情况中注册一个蓝图。

创建蓝图

首先先创建一个app.py作为Flask核心,这里我直接对蓝图进行了注册,注意:蓝图的注册需要放到main中进行注册,否则会进行报错。

from flask import Flask, render_template, url_for, flash
from flask import request,session,g,redirect
from flask_sqlalchemy import SQLAlchemy
import pymysql

app = Flask(__name__,static_url_path='/')
app.config['SECRET_KEY'] = "dsadsaffds"  # 设置生成session ID
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@localhost:3306/'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)  # 实例化对象


if __name__ == '__main__':
    from Control import commic_control,comment_control,user_control,admin_control
    app.register_blueprint(comment_control.comment)

    app.run(debug=True,host='127.0.0.1',port=3399)

接下来是真正的创建蓝图,代码如下:

from flask import Blueprint,render_template,url_for,session,request,redirect
comment = Blueprint('comment',__name__,url_prefix="/comment")  # 创建蓝图对象,其中第一个参数是指蓝图对象名(在jinja模板中可能会用到)。

这样蓝图的创建和注册就都完成了。其中有两个参数需要介绍下:

  • "comment": 蓝图的名称,这是一个必须的参数,这里的蓝图名称就是构成视图函数 endpoint 的一部分。
  • url_prefix="/comment": 该蓝图下所有路由的前缀地址,比如这里定义的前缀是 /comment,那么如果这个蓝图下有一个 /hello 路由,那么它的完整 URL 地址就是这样的 127.0.0.1:5000/comment/hello,这里要注意的是,url_prefix 并非是必须的参数.

蓝图的缺点:

不能在应用创建后撤销注册一个蓝图而不销毁整个应用对象。

使用蓝图的三个步骤:

创建一个蓝图对象

blue = Blueprint("blue",__name__)

在这个蓝图对象上进行操作,例如注册路由、指定静态文件夹、注册模板过滤器...

@blue.route('/')
def blue_index():
    return "Welcome to my blueprint"

在应用对象上注册这个蓝图对象

app.register_blueprint(blue,url_prefix="/blue")