蓝图单文件使用
作用:模块化开发
使用流程:
- 创建蓝图对象
- 使用蓝图装饰视图函数
- 将蓝图注册到app中
使用蓝图之后,我们就可以将视图函数从主函数中剥离出来,全部放到一个蓝图文件中。
比如,我们先写一个蓝图文件:
from flask import Blueprint
blue = Blueprint("my_blue", __name__)
# 使用蓝图装饰视图函数
@blue.route('/')
def index():
return 'index'
@blue.route('/add')
def add():
return 'add'
@blue.route('/delete')
def delete():
return 'delete'
然后是主函数文件:
from flask import Flask, Blueprint
from demo07_blue import blue
app = Flask(__name__)
app.register_blueprint(blue)
if __name__ == '__main__':
app.run()
同样,我们也可以新建一个user_blue的用户蓝图文件,创建user_blue蓝图对象,专门存放一些用户相关操作的视图函数,最后在主函数文件中注册。
以包的形式使用蓝图
这种方式更加灵活,每个蓝图都可以有自己的模板文件、静态文件和配置文件等。
首先我们新建一个package叫做user,专门用来处理用户相关的一些操作。创建好后,,里面会自动生成一个__init__.py文件,这个文件负责user模块的初始化。
在__init__.py中添加内容:
from flask import Blueprint
user_blue = Blueprint("user_blue", __name__)
from user import views # 这句很重要,不然直接返回没有视图函数
然后在user包中新建一个views.py,专门用来存放user的视图函数:
from user import user_blue
@user_blue.route('/')
def index():
return 'index'
最后在入口文件中注册即可:
from flask import Flask
from user import user_blue
app = Flask(__name__)
app.register_blueprint(user_blue)
if __name__ == '__main__':
app.run()
循环导包
这是一个典型的错误,编译器报错常显示
ImportError: cannot import name '***'
比如上面的代码中如果出现这样的改动就会导致循环导包:
在蓝图中添加静态和模板文件夹
user_blue = Blueprint("user_blue", __name__, static_folder='static', url_prefix='/user')
static_folder表示静态文件夹的名字,它的位置在user包中。为了防止与Flask类的static目录混淆,这里加一个url前缀/user,在查询时使用http://127.0.0.1:5000/user/static/img.png
即可访问到对应static文件中的静态资源。
同理,也可以创建user包底下的模板文件夹:
user_blue = Blueprint("user_blue", __name__, static_folder='static', url_prefix='/user', template_folder='templates')
这里要注意的是如果app中也设置了templates文件夹,并且有和user中同名的,那么用render_template(’’)渲染时优先渲染app里面的。不过我们一般都是给蓝图设置templates文件夹,app里面并不设置。