Flask蓝图的使用

前言

最近编写了一个Flask应用,其API接口路由数量较多,为了方便管理和分组接口代码,使用了Flask的蓝图功能,在此处做一个记录。

蓝图介绍

Flask 的蓝图(Blueprints)允许你将 Flask 应用分解成多个模块。这样可以更好地组织应用逻辑,使得应用更具可维护性和可扩展性。

每个蓝图可以有自己的路由、视图函数、模板和静态文件,这样可以将相关的功能分组。

通过使用蓝图,你可以将 Flask 应用拆分成多个模块,每个模块处理相关的功能,使得代码更加清晰和易于管理。

创建蓝图

创建蓝图涉及到以下几个步骤:

定义蓝图:在一个独立的模块(文件)中定义蓝图。

注册蓝图:在主应用中注册蓝图,使其生效。

项目结构

因为我的项目需求为纯API请求,不需要模板文件,因此选择直接将蓝图放在routes文件夹下

1
2
3
4
5
6
7
8
9
10
11
app/

├─ app.py
├─ config.py

└─ routes/
├─ index.py
├─ token.py
├─ user.py
└─ __init__.py

定义蓝图

index.py中的内容为例

Blueprint('index_bp', __name__):创建一个名为 index_bp 的蓝图。

蓝图中定义的路由函数可以用来处理请求。

1
2
3
4
5
6
7
8
9
from flask import Blueprint, jsonify, request

index_bp = Blueprint('index_bp', __name__)


# 定义/路由
@index_bp.route('/', methods=['GET', 'POST'])
def index():
return jsonify({'code': '500', 'error': 'Method not allowed'})

注册蓝图

app.py中注册蓝图,使其生效。

1
2
3
4
5
6
7
8
9
10
from flask import Flask
from routes import index_bp

app = Flask(__name__)

# 注册蓝图
app.register_blueprint(index_bp)

if __name__ == '__main__':
app.run(debug=True)

启动应用,访问http://localhost:5000/,可以看到返回的结果为{'code': '500', 'error': 'Method not allowed'},说明蓝图注册成功。

如果需要为蓝图添加前缀,可以修改index_bp的构造函数,添加url_prefix参数。

1
index_bp = Blueprint('index_bp', __name__, url_prefix='/index')

这样,访问http://localhost:5000/index/时,会返回{'code': '500', 'error': 'Method not allowed'}

在蓝图中使用钩子

蓝图支持请求钩子,例如 before_requestafter_request,可以在蓝图中定义这些钩子来处理请求和响应。

1
2
3
4
5
6
7
8
# 在蓝图中使用请求钩子,添加跨域支持
@index_bp.after_request
def after_request(response):
response.headers.add('Access-Control-Allow-Origin', '*')
response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')
response.headers.add('Access-Control-Allow-Methods', 'GET,POST,OPTIONS')
return response

使用蓝图中的模板和静态文件

蓝图可以包含模板文件和静态文件,可以将相关的功能分组,并在蓝图中使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
app/

├── app.py
├── auth/
│ ├── __init__.py
│ ├── routes.py
│ └── templates/
│ ├── login.html
│ └── register.html

└── user/
├── __init__.py
├── routes.py
└── templates/
├── index.html
└── profile.html