10.Flask之蓝图

模块化

随着flask程序越来越复杂,我们需要对程序进行模块化的处理,之前学习过python的模块化管理,于是针对一个简单的flask程序进行模块化处理

 

 

 一个项目,有且仅有一个app,而我们想要像上面一样对项目进行模块化管理,就需要用到蓝图。

接下来,我们根据步骤一步步来完成模块的实例化。

实例学蓝图

第一步

新建一个flask项目

 一般来说,项目的启动文件会命名为app.py或者manage.py。

 

第二步

举例来说:

我们有一个博客程序,前台界面需要的路由为:用户首页,列表,详情等页面

from flask import Flask

app = Flask(__name__)


# 用户首页模块
@app.route('/index')
def index():
    return 'index'


# 列表模块
@app.route('/list')
def list():
    return 'list'


# 详情模块
@app.route('/detail')
def detail():
    return 'detail'


if __name__ == '__main__':
    print(app.url_map)
    app.run()

 

第三步

目前,我们所有的代码都放到了启动文件中这样不利于维护,所有我们要对代码进行抽离,进行模块化管理。

我们右击项目-》New ->Python Package来创建一个python的文件夹。

在新建的文件夹中,默认有一个init初始化文件,文件中,一般存放着初始化信息,而里面的内容越少越好。

所以我们在users文件夹下新建一个views.py,用来专门存放用户模块中路由与视图。

 接下来,我们将之前主文件中用户模块相关内容放到这个views.py文件中

users -》views.py

from manage import app

# 用户首页模块
@app.route('/index')
def index():
    return 'index'

 

第四步

现在,我们运行一下改好的程序,会发现,在url_map中,根本没有显示放入views.py中的路由:

 

这可如何是好呢?

Flask为我们准备的蓝图正好可以解决这个问题,回到之前写好的views文件中。

之前,为了@app.route('/index')这个代码不报错,我们引入了app模块,而要使用蓝图,则要修改这部分内容。

users -》views.py

# 第一步:导入蓝图
from flask import Blueprint

# 第二步:创建蓝图对象
user_blue = Blueprint("user", __name__)

# 第三步:使用蓝图来注册路由
@user_blue.route('/index')
def index():
    return 'index'

 

第五步

到目前,蓝图基本内容就完成了,不过,为了抽取的更细化,我们还需要做一步操作。

第一二步的内容和路由及视图的主逻辑无关,所以我们可以将第一二步放入到__init__.py文件中:

users -》__init__.py

# 第一步:导入蓝图
from flask import Blueprint

# 第二步:创建蓝图对象
user_blue = Blueprint("user", __name__)

 

users -》views.py

from . import user_blue


# 第三步:使用蓝图来注册路由
@user_blue.route('/index')
def index():
    return 'index'

 说明:这里使用"."会优先从当前文件的__init__.py文件中查找相关内容。

 

 第六步

以为成功了?

当我们运行主文件之后,依然找不到,因为现在应用依然不知道我们设置的内容和它的关系。

其实,目前我们的蓝图已经存在,只是没有写入到app中的url_map中,所以我们只需要将蓝图注册到app中就可以了。

from flask import Flask
from users import user_blue

app = Flask(__name__)

# 将蓝图注册到app
app.register_blueprint(user_blue)

# 列表模块
@app.route('/list')
def list():
    return 'list'


# 详情模块
@app.route('/detail')
def detail():
    return 'detail'


if __name__ == '__main__':
    print(app.url_map)
    app.run()

以为成功了?你又错了兄弟,还没有呢!

 

第七步

在第六步中,虽然我们已经导入从users文件中导入了user_blue蓝图对象,也完成了注册,但是路由及视图都存放在了users目录下的views.py文件中。所以,这里一定一定要注意,在导入蓝图对象的同时,将其模块的views.py文件也导入进去:

from users import user_blue, views

运行下项目,会发现:

它来了!

如果这里总是忘记怎么办呢?可以用另一种方式:在模块的__init__.py中完成views.py的导入。

users -》__init__.py

# 第一步:导入蓝图
from flask import Blueprint

# 第二步:创建蓝图对象
user_blue = Blueprint("user", __name__)

from . import views

 

第八步

想给同一个模块下的视图路由加相同的前缀?没问题,在创建蓝图对象的时候,加入个参数即可:

users -》__init__.py

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

运行之后,会发现可以了:

 ok!这就是蓝图。

posted @ 2019-11-04 21:06  苦行僧95  阅读(58)  评论(0)    收藏  举报