背景: 在使用Flask轻量级框架的时候会遇到循环导包的错误,就是主程序中导入了某个模块的某个视图等,视图这边有导入主程序的app等造成的循环导入无法跳出来,针对这个问题我下面提供了解决方案供参考。
目录结构:
说明:
1.当导入cart包时就会自动执行初始化文件,可以把包理解为一个类,在实例化的时候一定会执行__init__函数。
2.模板文件和静态文件的查找顺序:根目录下面的templates先查找如果没有再去cart下的templates中查找。
主程序代码:
from flask import Flask
from templates.test import index
from cart import cart
app = Flask(__name__)
"""方案一:装饰器传参的方式"""
# 有效避开循环导入,先导入后装饰
app.route("/index")(index)
"""方案二:蓝图模板"""
"""在主程序中实现"""
# 创建蓝图对象 蓝图名称 蓝图所在的模块,寻找静态模板等
admin = Blueprint("admin_view", __name__)
# 注册蓝图路由
@admin.route("/")
def admin_index():
return "this is admin index"
# 在程序实例中注册该蓝图 蓝图对象 蓝图前缀
app.register_blueprint(admin, url_prefix="/admin")
"""层次感(推荐)"""
# 改为django框架里类似的导入方式
app.register_blueprint(cart, url_prefix="/cart")
if __name__ == '__main__':
print(app.url_map)
app.run()
补充: 当然可以执行主程序的时候想不导入其他的模块,当要用到的时候再去导入也可以解决。
init.py里的代码:
from flask import Blueprint
cart = Blueprint("cart_order", __name__)
from .view import cat_index
view里的代码:
from . import cart # .指的是当前目录下
@cart.route("/")
def cat_index():
return "this is cart index"