Flask——蓝图

蓝图介绍

一个项目中,有不同的模块,但是只有一个入口,程序入口可以随便取名,一般叫做,app.py或者manage.py。当我们写一个程序,当然可以在一个文件中写完,但是有一定规模的项目,我们肯定不会这样做,在开发中,讲究的是低耦合高内聚,所以对不同功能,我们会分成不同的模块,每个模块相互独立,但是都和app有关系。Flask中蓝图能够让我们以模块化的方式对项目进行管理。

例子中了解蓝图使用

(我想了想如何去写蓝图,想来想去,还是跟着思路写小项目,最好说明)

这是一个没有模块化的小项目

from flask import Flask

app = Flask(__name__)


@app.route('/user')
def user():
    return "这是用户模块"


@app.route('/order')
def order():
    return "这是订单模块"

if __name__ == '__main__':
    app.run()
View Code

这个是上面例子中对应的url_map

理想的程序入口应该只用来启动项目,而其他的则要抽离到对应的模块中。一般会创建一个python package包来专门写特定的模块。包中有一个init文件,一个包的初始化文件,里面的东西越少越好,

所以,一般在包中创建一个叫做views.py的视图文件。

将用户模块和订单模块分别放到对应的views.py文件中。

会发现app报了错误

然后通过from manage import app 导入包。

运行之后,会发现路由表中找不到这两个路由路径了。

原因是启动文件manage.py根本不知道有这两个文件。

如果在启动文件的manage.py中通过from ** import ** 来导入这两个模块的视图文件,

会发现,路由表中还是没有对应的路径

这个时候就用到了蓝图。

 在views视图中,不用app来注册路由,用蓝图来注册

一般情况下是一个模块,一个蓝图

# 导入蓝图
from flask import Blueprint

# 创建蓝图对象
user_blue = Blueprint("user")   # 第一个参数是蓝图的别名,第二个是import name,和a注册app一样,直接写__name__,其他参数目前用不到先不说

# 用蓝图注册路由
@user_blue.route("user")
def user():
    return "这是用户模块"
View Code

上面的做法不是很好,因为views应该就做视图函数,没有必要把创建蓝图对象的操作放里面,所以将导入蓝图和创建蓝图对象的操作放到python package包中的__init__.py的初始化文件中。

然后再在views视图文件中通过from . import user_blue来导入对象

运行之后发现,还是找不到这个路径,因为路由注册在蓝图里面,并没有到让app知道,所以将这个蓝图注册到app中就可以了

首先通过from import user_blue导入用户的蓝图对象,然后

app.register_blueprint(user_blue)

这样就将蓝图注册到app中了

这样做了,会发现还是url_map中还是没有,因为模块中的views并没有和任何文件建立关联

所以将views视图通过from users import views,再引入到启动文件,也就是manage.py中再运行。

这样就会发现url_map中有了这个路由的对应关系了。

将views引入启动文件中,并不是最好的,最好是将引入views的操作也放到模块的__init__的初始化文件中

问题

当两个模块中有一样的路径时访问会发生什么?

当url中写入这个路径的时候,会根据url_map表从上到下的顺序,访问第一个对应的模块中对应的视图函数。那Flask的路由岂不是很垃圾?

事实上,在Flask的注册蓝图对象的时候可以传入一个参数:url_prefix 。具体使用是:

user_blue = Blueprint('user', __name__, url_prefix='/users')

红色笔表示新的进入视图的路径

蓝笔画的order.表示是别名是order下的order_info视图函数。

 通过这种形式路径就得到了唯一的区分。

posted @ 2018-05-26 20:23  苦行僧95  阅读(304)  评论(0)    收藏  举报