前提

  • 了解 Flask 的基本操作

蓝图

一、什么是蓝图(Blueprints)

BlueprintsFlask 提供的一个类,用于注册 Flask 实例,是路由分类的一个工具。

二、蓝图的创建

在项目目录中,创建多个蓝图 package 用来管理不同的模块。比如:

admin
├── __init__.py
├── admin.py
├── auth.py
└── home.py

# home.py
from flask import Blueprint

home_admin = Blueprint('home', __name__)

@home_admin.route('/index')
def index():
    return '这是首页'
  
@home_admin.route('/hi')
def hi():
    return '你好啊啊!!'

首先,导入了蓝图并通过它创建了 home_admin 实例,第一个参数是蓝图的 名称 ,第二个参数是模块的名称( __name__ 是变量)。

三、注册蓝图

在上一步中,创建好了一个蓝图(分路由)。现在将蓝图注册到你的 Flask 实例中:

# index.py
from flask import Flask
from mysystem.blueprints.home import home_admin

app = Flask(__name__)

# app.register_blueprint(home_admin) # 注册蓝图
app.register_blueprint(home_admin, url_prefix='/home') # 添加URL前缀

测试文件运行请查看 python打造个人管理系统01-创建初始项目

现在,就可以进行访问了:

四、蓝图 Endpoint

在命令行中,使用命令 flask routes ,可以查看路由信息:

路由信息

可以看到,其中有个叫 Endpoint 的东西,它是干嘛的?
其实,当我们访问 http://127.0.0.1:5000/home/hi 的时候,它并不是直接映射 hi() 的方法,而是通过 Endpoint 来做映射,也就是这样:

/home/hi --> home.hi --> hi()

这样的好处就是可以很容易的区分在不同蓝图中的同名路由。

所以,当你用 url_for() 来获取 URL 的时候,可以通过 Endpoint 来获取:

url_for('home.hi')    # 在其他蓝图下
url_for('.hi')        # 在自身蓝图下

五、蓝图的资源

如果每个蓝图的样式不统一,我们可以将其对应的静态文件放在相应的蓝图下,即在蓝图下创建子包统一管理资源。

admin
├── __init__.py
├── admin.py
├── auth.py
└── home.py

就会变成这样:

admin
├── __init__.py
├── admin.py
├── auth.py
└── home
    ├── init.py
    ├── home.py
    ├── static
    │    └── home.css
    └── templates
        └── home.html

想要引用这些资源,只要在创建蓝图的时候默认定义:

home_dp = Blueprint('home', __name__, template_folder='tempaltes', static_folder='static')

总结

本文介绍了蓝图的一些基本操作,不纳入项目的一部分。

  • 创建蓝图
  • 注册蓝图
  • 蓝图的工作过程
  • 蓝图的资源引用