python3+flask 开发web(八)——flask中的蓝图

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'

执行结果:

python3+flask 开发web(八)——flask中的蓝图_第1张图片

4)以模块的形式实现路由:

目录结构如下:

python3+flask 开发web(八)——flask中的蓝图_第2张图片

(1)新建两个python文件夹goods和orders

(2)goods文件夹下的__init__.py和views.py内容如下:

python3+flask 开发web(八)——flask中的蓝图_第3张图片python3+flask 开发web(八)——flask中的蓝图_第4张图片

(3)orders文件夹下的__init__.py和views.py内容如下:

python3+flask 开发web(八)——flask中的蓝图_第5张图片python3+flask 开发web(八)——flask中的蓝图_第6张图片

(4)manage.py中的内容如下:

python3+flask 开发web(八)——flask中的蓝图_第7张图片

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()

执行结果:

控制台输出:

python3+flask 开发web(八)——flask中的蓝图_第8张图片

url中的显示 

python3+flask 开发web(八)——flask中的蓝图_第9张图片python3+flask 开发web(八)——flask中的蓝图_第10张图片

参考博文:https://blog.csdn.net/Enjolras_fuu/article/details/79933756

你可能感兴趣的:(python学习)