flask中的蓝图:
1)我们在一个文件中写入多个路由,这会使代码维护变得困难
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return 'index' @app.route('/list') def list(): return 'list' @app.route('/detail') def detail(): return 'detail' @app.route('/') def admin_home(): return 'admin_home' @app.route('/new') def new(): return 'new' @app.route('/edit') def edit(): return 'edit' if __name__=='__main__': app.run()2)尝试用模块导入的方式解决.我们把上述一个py文件的多个路由视图函数给拆成两个文件:app.py和admin.py文件。app.py文件作为程序启动文件,因为admin文件没有应用程序实例app,在admin文件中要使用app.route路由装饰器,需要把app.py文件的app导入到admin.py文件中。
app.py文件:
from flask import Flask # 导入admin中的内容 from admin import * app = Flask(__name__) @app.route('/') def index(): return 'index' @app.route('/list') def list(): return 'list' @app.route('/detail') def detail(): return 'detail' if __name__ == '__main__': app.run()admin.py文件内容如下:
from app import app @app.route('/') def admin_home(): return 'admin_home' @app.route('/new') def new(): return 'new' @app.route('/edit') def edit(): return 'edit'启动app.py文件后,我们发现admin.py文件中的路由都无法访问。 也就是说,python中的模块化虽然能把代码给拆分开,但不能解决路由映射的问题。访问127.0.0.1:5000/new或者edit的时候会报错
什么是蓝图:可以在Flask层上将一个Flask应用进行“分割”,实现模块化管理,这极大地简化了构建大型应用的流程,也使得应用的维护变得更加容易。另外,“蓝图”还提供了一种Flask扩展在应用上注册操作的核心方法。
蓝图的运行机制 蓝图是保存了一组将来可以在应用对象上执行的操作。注册路由就是一种操作,当在程序实例上调用route装饰器注册路由时,这个操作将修改对象的url_map路由映射列表。当我们在蓝图对象上调用route装饰器注册路由时,它只是在内部的一个延迟操作记录列表defered_functions中添加了一个项。当执行应用对象的 register_blueprint() 方法时,应用对象从蓝图对象的 defered_functions 列表中取出每一项,即调用应用对象的 add_url_rule() 方法,这将会修改程序实例的路由映射列表。
3)将上面的代码通过蓝图改造后:
app.py
from flask import Flask from admin import * app = Flask(__name__) app.register_blueprint(admin,url_prefix='/admin') @app.route('/') def index(): return 'index' @app.route('/list') def list(): return 'list' @app.route('/detail') def detail(): return 'detail'admin.py
from flask import Blueprint admin =Blueprint('admin',__name__) @admin.route('/') def admin_home(): return 'admin_home' @admin.route('/new') def new(): return 'new' @admin.route('/edit') def edit(): return 'edit'执行结果:
4)以模块的形式实现路由:
目录结构如下:
(1)新建两个python文件夹goods和orders
(2)goods文件夹下的__init__.py和views.py内容如下:
(3)orders文件夹下的__init__.py和views.py内容如下:
(4)manage.py中的内容如下:
from flask import Flask from orders import orders_blue from goods import goods_blue app=Flask(__name__) #将蓝图注册到app app.register_blueprint(orders_blue) app.register_blueprint(goods_blue) @app.route('/') def index(): return 'index' if __name__=='__main__': print(app.url_map) #打印app的路由 app.run()执行结果:
控制台输出:
url中的显示
参考博文:https://blog.csdn.net/Enjolras_fuu/article/details/79933756