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)。
- 启动项目即可打开浏览器看到效果。