Flask基础二
蓝图的引入
虽然一个py文件确实能够写完所有的flask功能,从路由到视图到数据库,但是实际上并没有任何实际项目这么做,原因在于管理起来非常不方便,作为一个成熟的框架怎么可能会存在管理混乱的现象,所以我们先简单的看视图py文件和运行py文件进行分离的问题
运行py文件: main_func文件
from flask import Flask
app = Flask(__name__)
import the_view # 导入的时候就会执行
if __name__ == '__main__':
app.run()
上面是主运行文件,创建一个app后应该绑定视图的,但是这既然要视图和主程序进行分离,则将视图写成一个新的py文件进行导入
视图文件: the_view
from other_file.main_func import app
@app.route('/')
def show():
return '显示'
视图函数中没有app,则需要从主文件中进行导入,看起来没问题,导入之后就能够进行注册视图
实际上启动之后并不会成功显示,main_func运行的时候,创建了一个app对象后继续向下运行,运行到import the_view语句的时候就将视图文件的代码加载进来并执行
此时执行视图文件,那么视图文件的第一条就是导入主文件,好的,在视图文件执行第一行的时候就把主文件加载进来执行,此时主文件又执行
from flask import Flask
app = Flask(__name__)
那么问题就出现了,这里再一次实例化了一个app对象,当然还没有执行完,后面继续执行导入视图文件,但是因为python在底层就已经设定了防止循环导入的设置,所以种里导入操作不成功,执行完成,所以种类就算是把视图文件的第一行执行完了,接下来视图文件就用新的app对象进行注册函数
视图文件执行完成后,主文件的导入视图文件语句执行完成,继续向下执行,当执行到app.run()的时候问题就来了,主文件中的app实际上与在导入视图文件时注册的app并不是同一个,那么用这个app启动的服务器并没有把视图注册进来,从而不管怎么调整都是404
这里就是因为
app = Flask(__name__)
属于全局变量,从而导致只要这个py文件被调用,这个对象就会重新创建,所以就导致注册的app与启动服务器的app并不一致,flask为了解决这种问题使用了蓝图
蓝图
蓝图的使用分为三步,第一步导入库,第二步实例化蓝图对象,第三步绑定对应的视图
那么如果是出现功能分离,不能在一个页面中进行显示的话,那么蓝图也会被其他py文件进行导入,这种导入就是单向的导入
主py文件
from flask import Flask
app = Flask(__name__)
# 主应用中进行蓝图的注册
from other_file.the_view import bp # 把对应的蓝图进行导入,因为我是放在了other_file文件里面
app.register_blueprint(bp)
if __name__ == '__main__':
app.run()
视图py文件
from flask import Blueprint
bp = Blueprint('the_view', __name__)
@bp.route