Flask 之蓝图

Flask 的路由机制十分的巧妙。

入门的普通用法是直接

@app.route("/path")
def method_name():
    pass

这样的话预示着我们只能在单文件进行路由分发吗?

答案当然是否定的,Flask 为我们提供了一个叫做 Blueprint 的东西。

在开始之前,顺上我的目录结构,让读者更清晰的阅读:

├── __init__.py
├── __pycache__
├── blueprint
│   ├── __init__.py
│   ├── __pycache__
│   └── test.py
└── flask_test.py

直接上代码先看洗脑,flask_test.py 文件:

from flask import Flask

app = Flask(__name__)

def register_blueprint(app):
    from test.blueprint import blueprint
    app.register_blueprint(blueprint)

register_blueprint(app)

if __name__ == "__main__":
    app.run(port=8081)

可以看到以上代码中,有一个 register_blueprint 函数,需要传入形参 app。然后我们调用了它,传入了实参 app (实例化的 flask 对象)。

然后导入了一个 blueprint,并且将其通过 flask 对象的 register_blueprint 函数将其注册到 flask 对象中。

接下来我们进入 blueprint/__init__.py 中看一下代码:

from flask import Blueprint

blueprint = Blueprint('test', __name__, url_prefix="/test")

from test.blueprint import test

可以看到,__init__.py 中实例化了一个 Blueprint 对象 blueprint (具体的实例化参数,请阅读源码或者文档,又或者在评论区进行提问),然后引入了一下 blueprint 文件夹下面的 test.py 文件。现在我们看看 test.py 里做了什么。

from test.blueprint import blueprint

@blueprint.route("/test")
def test_blueprint():
    return "Hello Blueprint!"

可以看到 test.py 做的事情,很简单,它引入了__init__.py 里的 blueprint 这个实例化对象。然后定义了一个函数,并加上了路由装饰器。这个步骤是简单的,跟我们普通的注册路由完全没有区别,唯一的区别就是从 app 变成了 blueprint 这个 Blueprint 对象。

在做完这些操作之后,回到 flask_test.py run 一下。然后打开浏览器,输入 127.0.0.1:8081/test/test 即可看到 "Hello Blueprint!" 字样,如此一来,相信你就能知道 Blueprint 的用法了。我这里也来总结一下:

  1. __init__.py 创建 Blueprint 对象。
  2. 创建对应的路由分发文件,引入创建好的 Blueprint 对象,进行函数定义和路由装饰。
  3. __init__.py 文件引入创建好的路由分发文件。
  4. 在创建 flask 对象的文件内引入创建 Blueprint 对象的包的__init__.py 文件里的 Blueprint 对象 (python 导入包默认是引入的__init__.py)。
  5. 将导入的 Blueprint 对象通过 register_blueprint 函数注册到 flask 对象里 (我这里的代码里是 app)。
  6. 启动项目即可打开浏览器看到效果。