blueprint类似于前端的路由,当fllask程序越来越庞大,涉及到的接口越来越多,不可能就全凭 @app.route 就可以搞定多级路由,于是可以使用蓝图blueprint来解决,可以使项目结构更清晰.

  • 目录结构

flaskr.py是根目录下的主入口文件,views文件夹用于存放视图函数,user文件夹下,__init__.py是用于导包的, 是一个标识,如果没有该文件,该目录就不会认为是package ,IDE会报错.

  • 主要思路

在每个view文件夹中创立对应的__init__.py和view.py文件.

在__init__.py中这样写:

from flask import Blueprint, request, jsonify
user = Blueprint("user",__name__, url_prefix="/user")
from . import view

创建一个蓝图对象,”user”是蓝图的名称,一定要确保该名称唯一,url_prefix参数表示路由前缀,在文件底部导入view.py,相当于执行一遍里面的代码,至于为什么在最后面导入,是因为,先创建蓝图对象后,才可以使用装饰器的方法来进行二级路由的监听

具体的视图函数可以写在view.py里面.

在view中导入__init__.py中的蓝图对象后,就可以 使用装饰器的方法来进行二级路由的监听

最后,在flaskr.py,主文件中导入__init__.py中的蓝图对象,并且使用flask中的register_blueprint()来进行蓝图注册.

from views.user import user
app.register_blueprint(user) # 注册蓝图

现在已经可以通过注册的路由来获取数据了.

  • 其中的坑

一开始使用蓝图的时候,我没有想太多,将就flask官方文档demo的代码结构和文件结构写,写的时候就发现了一件很奇怪的事情,控制台莫名其妙报无法导包的错误,检查了很久也没发现其中的原因,甚至IDE中按ctrl可以直达文件,看来并不是文件路径等问题.

后来研究发现,是因为我两个py文件之间循环导入造成的,我将sql连接实例放在了app的入口文件flaskr.py中,然后在 flaskr.py 文件中导入存放视图函数的view.py文件,同时在 view.py 中由于需要操作数据库,肯定是要导入sql实例的,无奈,又写了一句from .. import sql,这样子就造成了循环导入.

此图像的alt属性为空;文件名为image-3-1024x686.png

经过修改,将sql实例单独提出来放在initApp.py中,然后在app和view中都引用就可以了.

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注