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!这就是蓝图。