上一篇 文章说到用装饰器的方法能够解决模块划分但是有一个问题就是路由和视图函数之间的关系并不直观,蓝图的存在解决了这个问题
蓝图的基本定义和使用
首先在orders.py里面定义一个蓝图
# encoding=utf-8
__author__ = "zhangyue"
from flask import Flask,Blueprint
# 创建一个蓝图的对象,蓝图就是一个小模块的抽象的概念
app_orders = Blueprint("app_orders",__name__)
@app_orders.route("/get_orders")
def get_orders():
return "get_orders page"
然后在main.py里面导入oders里的蓝图,注册蓝图
# encoding=utf-8
__author__ = "zhangyue"
from flask import Flask
from user import register
from goods import get_goods
from orders import app_orders
app = Flask(__name__)
# 注册蓝图
app.register_blueprint(app_orders)
@app.route("/")
def index():
return "index page"
app.route("/register")(register)
app.route("/get_goods")(get_goods)
if __name__ == '__main__':
app.run()
给蓝图设置url前缀
加上一个参数就好
# 注册蓝图
app.register_blueprint(app_orders,"/orders")
以目录形式定义蓝图
目录结构如图
现在init文件里创建一个蓝图
# encoding=utf-8
__author__ = "zhangyue"
from flask import Blueprint
# 创建了一个蓝图
app_cart = Blueprint("app_cart",__name__)
在views里导入刚刚创建的蓝图,并设置路由视图
# encoding=utf-8
__author__ = "zhangyue"
from flask import Flask
from . import app_cart
@app_cart.route("/get_cart")
def get_cart():
return "get cart page"
在main里注册蓝图
但是现在路由还没有生效,因为main导入cart的app_cart的时候执行init文件,但是init文件中只是创建了蓝图,并没有把视图view加载进来,现在补全
# encoding=utf-8
__author__ = "zhangyue"
from flask import Blueprint
# 创建了一个蓝图
app_cart = Blueprint("app_cart",__name__)
# 在init文件被执行的时候,把视图加载进来,让蓝图与应用程序知道有视图的存在
from .views import get_cart
蓝图里模板目录的处理
如果是现在这样是找不到cart.html的.需要在创建蓝图的时候制定模板目录路径