用 Flask 来写个轻博客 (16) — MV(C)_Flask Blueprint 蓝图
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog
目录
前文列表
用 Flask 来写个轻博客 (1) — 创建项目
用 Flask 来写个轻博客 (2) — Hello World!
用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQL 和 SQLAlchemy
用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表
用 Flask 来写个轻博客 (5) — (M)VC_SQLAlchemy 的 CRUD 详解
用 Flask 来写个轻博客 (6) — (M)VC_models 的关系(one to many)
用 Flask 来写个轻博客 (7) — (M)VC_models 的关系(many to many)
用 Flask 来写个轻博客 (8) — (M)VC_Alembic 管理数据库结构的升级和降级
用 Flask 来写个轻博客 (9) — M(V)C_Jinja 语法基础快速概览
用 Flask 来写个轻博客 (10) — M(V)C_Jinja 常用过滤器与 Flask 特殊变量及方法
用 Flask 来写个轻博客 (11) — M(V)C_创建视图函数
用 Flask 来写个轻博客 (12) — M(V)C_编写和继承 Jinja 模板
用 Flask 来写个轻博客 (13) — M(V)C_WTForms 服务端表单检验
用 Flask 来写个轻博客 (14) — M(V)C_实现项目首页的模板
用 Flask 来写个轻博客 (15) — M(V)C_实现博文页面评论表单
扩展阅读
用蓝图实现模块化应用
第一期 · 如何理解Flask中的蓝图?
Blueprint 蓝图
Blueprint 蓝图是一种用来扩展已有 Flask 应用结构的方法,通过蓝图的思想我们能够把自己的 Application 拆分成为不同的组件。通常,一个组件代表了 Application 的一个功能模块,我们称之为一个蓝图,但本质上是由一些被注册到这个蓝图中的视图集所组成的。而且还可以在该蓝图中定义其独有的模板文件目录(template_folder)和静态文件目录(static_folder)。最后,将一个个这样的蓝图 Register 到 Flask 的主 app 中,最终整合成为一个完整的 Application,所以蓝图在 Flask 中充当了 MVC 架构中的 Controller 角色。在本项目里,我们也会使用蓝图的方法来重构已往的代码和目录结构。
定义一个蓝图
NOTE : 这里只是一个辅助理解的例子,并不作用到项目中。
- vim admin_pages/admin.py
from flask import Blueprint
admin = Blueprint(
'admin',
'__name__',
template_folder='template/admin',
static_folder='static/admin',
url_prefix='/admin')
@admin.route('/')
def home():
return render_template('home.html')
NOTE 1: 蓝图类
Blueprint必须接收两个参数 蓝图名(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
from admin_pages import admin
app.register_blueprint(admin)
这就是定义一个蓝图并将该蓝图注册到 app 中的过程。接下来我们就会将蓝图应用到 blog 项目中来。
创建蓝图 blog
- views.py
创建蓝图首先我们要在视图函数的模块中使用 Blueprint class 来生成一个蓝图对象,使视图模块编程蓝图模块。
from os import path
from flask import render_template, Blueprint
blog_blueprint = Blueprint(
'blog',
__name__,
template_folder=path.join('templates/blog'),
url_prefix='/blog')
由于为蓝图 blog 定义了新的模板文件存放路径,所以将该蓝图所需要的模板文件都从 templates/ move 到 templates/blog/ 下。
将所有的 app.route() 修改为使用蓝图的路由定义,将视图函数都注册到蓝图中:
@blog_blueprint.route('/')
@blog_blueprint.route('/<int:page>')
def home(page=1):
"""View function for home page"""
- main.py
在if __name__ == '__main__':之后将新建的蓝图对象 blog_blueprint 注册到 app 中:
if __name__ == '__main__':
app.register_blueprint(blog_blueprint)
app.run()
现在蓝图 blog 将所有的视图函数都搬离 app 注册到蓝图 blog 中了,但是 app 对象作为入口不能够没有视图函数,所以在为其定义一个根目录视图函数,并且重定向到蓝图 blog 的 home() 中:
from flask import Flask, redirect
@app.route('/')
def index():
return redirect(url_for('blog.home'))
NOTE: 这里的 url_for 传入了 blog.name 而不是 blog_blueprint.home 是因为 Flask 内部搜索的关键字为蓝图的名字而不是蓝图对象的变量名。
用 Flask 来写个轻博客 (16) — MV(C)_Flask Blueprint 蓝图的更多相关文章
- 用 Flask 来写个轻博客 (17) — MV(C)_应用蓝图来重构项目
目录 目录 前文列表 重构目录结构 重构代码 使用蓝图后的路由过程 总结 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写个轻博客 (2) - Hello World ...
- 用 Flask 来写个轻博客
用 Flask 来写个轻博客 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hello World! 用 Flask 来写个轻博客 (3) — (M)V ...
- 用 Flask 来写个轻博客 (37) — 在 Github 上为第一阶段的版本打 Tag
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 第一阶段结语 打 Tag 前文列表 用 Flask 来写个轻博客 (1 ...
- 用 Flask 来写个轻博客 (36) — 使用 Flask-RESTful 来构建 RESTful API 之五
目录 目录 前文列表 PUT 请求 DELETE 请求 测试 对一条已经存在的 posts 记录进行 update 操作 删除一条记录 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 ...
- 用 Flask 来写个轻博客 (35) — 使用 Flask-RESTful 来构建 RESTful API 之四
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 POST 请求 身份认证 测试 前文列表 用 Flask 来写个轻博客 ...
- 用 Flask 来写个轻博客 (34) — 使用 Flask-RESTful 来构建 RESTful API 之三
目录 目录 前文列表 应用请求中的参数实现 API 分页 测试 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写个轻博客 (2) - Hello World! 用 F ...
- 用 Flask 来写个轻博客 (33) — 使用 Flask-RESTful 来构建 RESTful API 之二
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 构建 RESTful Flask API 定义资源路由 格式 ...
- 用 Flask 来写个轻博客 (32) — 使用 Flask-RESTful 来构建 RESTful API 之一
目录 目录 前文列表 扩展阅读 RESTful API REST 原则 无状态原则 面向资源 RESTful API 的优势 REST 约束 前文列表 用 Flask 来写个轻博客 (1) - 创建项 ...
- 用 Flask 来写个轻博客 (31) — 使用 Flask-Admin 实现 FileSystem 管理
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 编写 FileSystem Admin 页面 Flask-A ...
随机推荐
- STM32串口USART1的使用方法和程序
通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换. USART利用分数波特率发生器提供宽范围的波特率选择,支持同步单向通信和半 ...
- 《图解设计模式》读书笔记6-1 VISITOR模式
目录 1. Visitor模式简介 2. 示例 2.1 类图 2.2 代码 3. 模式的角色和类图 4. 思路拓展 4.1 双重分发 4.2 开闭原则 4.3 难以增加ConcreteElement角 ...
- iOS OpenGL ES简单绘制三角形
OpenGL 是用于2D/3D图形编程的一套基于C语言的统一接口. windows,Linux,Unix上均可兼容. OpenGL ES 是在OpenGL嵌入式设备上的版本, android/iOS ...
- 关于JS读取DOM对象(标签)的自定义属性
DOM对象对于js来说,是个很基础的元素,我们写js一般来说,都一定会对它进行操作.我们可以很方便地给它加上自定义的属性,比如: var test = document.getElementById( ...
- selenium,webdriver,xpath获取全国各地的邮编
代码要多敲 注释要清晰 其中区号没有拿取出来 看到的朋友可以作为练习 ,有好的方法可以在下面留言 from selenium import webdriver from lxml import etr ...
- ftrace 使用方法
1. 追蹤Kernel function (以schedule()示範) 先至 /sys/kernel/debug/tracing# cat available_tracers 確定有無 函式追蹤器( ...
- VINS 回环检测与全局优化
回环检测 VINS回环检测与全局优化都在pose_graph.cpp内处理.首先在pose_graph_node加载vocabulary文件给BriefDatabase用,如果要加载地图,会loadP ...
- C#读取Xml中出现”&”等特殊符号
原文:C#读取Xml中出现"&"等特殊符号 C#读取Xml中出现的特殊符号时用ASCII或者转定义名称代替.程序读进来后转成字符串后就自动变成相应的字符了,再度保存时会以正 ...
- 【知识强化】第五章 输入/输出(I/O)管理 5.1 I/O管理概述
这门课的最后一个章节——设备管理. 操作系统它作为系统资源的管理者,既需要对上层的软件进行管理,也需要对下层的硬件进行管理.操作系统它需要对处理机还有存储器这些硬件进行管理,但是这些硬件其实是在计算机 ...
- MYSQL全文索引—CONTAINS语法
我们通常在 WHERE 子句中使用 CONTAINS ,就象这样:SELECT * FROM table_name WHERE CONTAINS(fullText_column,'search con ...