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 的用法了。我这里也来总结一下:
- 在
__init__.py
创建 Blueprint 对象。 - 创建对应的路由分发文件,引入创建好的 Blueprint 对象,进行函数定义和路由装饰。
- 在
__init__.py
文件引入创建好的路由分发文件。 - 在创建 flask 对象的文件内引入创建 Blueprint 对象的包的
__init__.py
文件里的 Blueprint 对象 (python 导入包默认是引入的__init__.py
)。 - 将导入的 Blueprint 对象通过 register_blueprint 函数注册到 flask 对象里 (我这里的代码里是 app)。
- 启动项目即可打开浏览器看到效果。