天天看点

用 Flask 来写个轻博客 (16) — MV(C)_Flask Blueprint 蓝图目录前文列表扩展阅读Blueprint 蓝图定义一个蓝图注册一个蓝图创建蓝图 blog

<a href="#%E7%9B%AE%E5%BD%95">目录</a>

<a href="#%E5%89%8D%E6%96%87%E5%88%97%E8%A1%A8">前文列表</a>

<a href="#%E6%89%A9%E5%B1%95%E9%98%85%E8%AF%BB">扩展阅读</a>

<a href="#blueprint-%E8%93%9D%E5%9B%BE">Blueprint 蓝图</a>

<a href="#%E5%AE%9A%E4%B9%89%E4%B8%80%E4%B8%AA%E8%93%9D%E5%9B%BE">定义一个蓝图</a>

<a href="#%E6%B3%A8%E5%86%8C%E4%B8%80%E4%B8%AA%E8%93%9D%E5%9B%BE">注册一个蓝图</a>

<a href="#%E5%88%9B%E5%BB%BA%E8%93%9D%E5%9B%BE-blog">创建蓝图 blog</a>

<a href="http://blog.csdn.net/jmilk/article/details/53150084">用 Flask 来写个轻博客 (1) — 创建项目</a>

<a href="http://blog.csdn.net/jmilk/article/details/53152158">用 Flask 来写个轻博客 (2) — Hello World!</a>

<a href="http://blog.csdn.net/jmilk/article/details/53153382">用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQL 和 SQLAlchemy</a>

<a href="http://blog.csdn.net/jmilk/article/details/53184903">用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表</a>

<a href="http://blog.csdn.net/jmilk/article/details/53187575">用 Flask 来写个轻博客 (5) — (M)VC_SQLAlchemy 的 CRUD 详解</a>

<a href="http://blog.csdn.net/jmilk/article/details/53229180">用 Flask 来写个轻博客 (6) — (M)VC_models 的关系(one to many)</a>

<a href="http://blog.csdn.net/jmilk/article/details/53239740">用 Flask 来写个轻博客 (7) — (M)VC_models 的关系(many to many)</a>

<a href="http://blog.csdn.net/jmilk/article/details/53241361">用 Flask 来写个轻博客 (8) — (M)VC_Alembic 管理数据库结构的升级和降级</a>

<a href="http://blog.csdn.net/jmilk/article/details/53264049">用 Flask 来写个轻博客 (9) — M(V)C_Jinja 语法基础快速概览</a>

<a href="http://blog.csdn.net/jmilk/article/details/53292248">用 Flask 来写个轻博客 (10) — M(V)C_Jinja 常用过滤器与 Flask 特殊变量及方法</a>

<a href="http://blog.csdn.net/jmilk/article/details/53303870">用 Flask 来写个轻博客 (11) — M(V)C_创建视图函数</a>

<a href="http://blog.csdn.net/jmilk/article/details/53306560">用 Flask 来写个轻博客 (12) — M(V)C_编写和继承 Jinja 模板</a>

<a href="http://blog.csdn.net/jmilk/article/details/53321939">用 Flask 来写个轻博客 (13) — M(V)C_WTForms 服务端表单检验</a>

<a href="http://blog.csdn.net/jmilk/article/details/53327164">用 Flask 来写个轻博客 (14) — M(V)C_实现项目首页的模板</a>

<a href="http://blog.csdn.net/jmilk/article/details/53332204">用 Flask 来写个轻博客 (15) — M(V)C_实现博文页面评论表单</a>

<a href="http://www.pythondoc.com/flask/blueprints.html">用蓝图实现模块化应用</a>

<a href="https://zhuanlan.zhihu.com/p/21743996">第一期 · 如何理解Flask中的蓝图?</a>

Blueprint 蓝图是一种用来扩展已有 Flask 应用结构的方法,通过蓝图的思想我们能够把自己的 Application 拆分成为不同的组件。通常,一个组件代表了 Application 的一个功能模块,我们称之为一个蓝图,但本质上是由一些被注册到这个蓝图中的视图集所组成的。而且还可以在该蓝图中定义其独有的模板文件目录(template_folder)和静态文件目录(static_folder)。最后,将一个个这样的蓝图 Register 到 Flask 的主 app 中,最终整合成为一个完整的 Application,所以蓝图在 Flask 中充当了 MVC 架构中的 Controller 角色。在本项目里,我们也会使用蓝图的方法来重构已往的代码和目录结构。

NOTE : 这里只是一个辅助理解的例子,并不作用到项目中。

vim admin_pages/admin.py

NOTE 1: 蓝图类<code>Blueprint</code> 必须接收两个参数 蓝图名(admin) 和 当前的包名(__name__)

NOTE 2: 可选参数定义了该蓝图到那里去寻找所需要的文件(template_folder/static__folder)

NOTE 3: 由于指定了参数 template_folder 所以该蓝图的视图函数 home() 不会到默认的 template/ 目录下寻找模板文件 home.html 而是到 template/admin/ 目录下寻找 home.html

NOTE 4: 参数 url_prefix 会为 URL 添加上前缀 admin,即:视图函数 home() 的 URL 路由实际上是 /admin/ ,而不是 /

NOTE 5: 所以当我们在模板中使用 url_for() 函数时,传入的参数就不是 url_for(‘home’) 了,而是 url_for(‘admin.home’) 或 url_for(‘.home’) 如果需要查找的 URL 路由跟当前视图函数是在同一个蓝图下的话。

需要将蓝图注册到 Flask 的 app 中,该蓝图才能够生效。

main.py

这就是定义一个蓝图并将该蓝图注册到 app 中的过程。接下来我们就会将蓝图应用到 blog 项目中来。

views.py

创建蓝图首先我们要在视图函数的模块中使用 Blueprint class 来生成一个蓝图对象,使视图模块编程蓝图模块。

由于为蓝图 blog 定义了新的模板文件存放路径,所以将该蓝图所需要的模板文件都从 templates/ move 到 templates/blog/ 下。

将所有的 app.route() 修改为使用蓝图的路由定义,将视图函数都注册到蓝图中:

在 <code>if __name__ == '__main__':</code> 之后将新建的蓝图对象 blog_blueprint 注册到 app 中:

现在蓝图 blog 将所有的视图函数都搬离 app 注册到蓝图 blog 中了,但是 app 对象作为入口不能够没有视图函数,所以在为其定义一个根目录视图函数,并且重定向到蓝图 blog 的 home() 中:

NOTE: 这里的 url_for 传入了 blog.name 而不是 blog_blueprint.home 是因为 Flask 内部搜索的关键字为蓝图的名字而不是蓝图对象的变量名。