文章目录
- [摘要,视图函数只负责请求 → 响应,业务逻辑(数据处理)和表现逻辑(HTML 页面生成)要分开,模板(Jinja2) 用来渲染页面 → 表现逻辑移到模板中](#摘要,视图函数只负责请求 → 响应,业务逻辑(数据处理)和表现逻辑(HTML 页面生成)要分开,模板(Jinja2) 用来渲染页面 → 表现逻辑移到模板中)
-
- [什么是业务逻辑 vs 表现逻辑](#什么是业务逻辑 vs 表现逻辑)
- 为什么要用模板【带占位符的文件】(Template)?
- 渲染(Rendering)是什么?把模板里的占位符替换成真实值
- [3.1 Jinja2模板引擎](#3.1 Jinja2模板引擎)
-
- 渲染模板
-
- [默认情况下,Flask在应用目录中的templates子目录里寻找模板。应用目录是哪个?创建 Flask 对象的那个 Python 文件所在目录](#默认情况下,Flask在应用目录中的templates子目录里寻找模板。应用目录是哪个?创建 Flask 对象的那个 Python 文件所在目录)
- [render_template() 把模板和数据结合,并渲染成最终的html,返给浏览器](#render_template() 把模板和数据结合,并渲染成最终的html,返给浏览器)
- [3.1.2 变量](#3.1.2 变量)
-
-
A value from a dictionary: {{ mydict'key' }}.
-
A value from a list: {{ mylist3 }}.
-
A value from a list, with a variable index: {{ mylistmyintvar, mydictmykey }}.
-
A value from an object's method: {{ myobj.somemethod() }}.
-
[可以在模板里几乎和 Python 一样操作数据,](#可以在模板里几乎和 Python 一样操作数据,)
-
[过滤器 把左边的值传给右边的过滤器](#过滤器 把左边的值传给右边的过滤器)
-
- [safe:渲染时不转义 HTML](#safe:渲染时不转义 HTML)
- capitalize:首字母大写,其他小写
- lower:全部小写
- upper:全部大写
- title:每个单词首字母大写
- trim:去掉首尾空格
- [striptags:去掉 HTML 标签](#striptags:去掉 HTML 标签)
- 链式调用:组合多个过滤器
-
- 3.1.3 控制结构
-
- 条件判断(if/else)
- 循环(for)
- [宏(macro) --- 模板里的"函数"](#宏(macro) — 模板里的“函数”)
-
- 宏的导入(import)
-
- [Jinja2 宏导入从 Flask 的模板根目录 (templates) 开始找,相对路径写文件名或子目录路径即可。](#Jinja2 宏导入从 Flask 的模板根目录 (templates) 开始找,相对路径写文件名或子目录路径即可。)
- [include --- 引入模板片段。直接把另一个模板内容原封不动插入。](#include — 引入模板片段。直接把另一个模板内容原封不动插入。)
-
- [从 Flask 的模板根目录开始找(默认模板根目录)](#从 Flask 的模板根目录开始找(默认模板根目录))
- [include ------ 引入模板片段, import ------ 引入宏(宏是函数)](#include —— 引入模板片段, import —— 引入宏(宏是函数))
- [模板继承(extends / block / super)](#模板继承(extends / block / super))
- [Jinja2 的重复使用代码片段方法总结,宏,include,模板继承](#Jinja2 的重复使用代码片段方法总结,宏,include,模板继承)
- [3.2 使用Flask-Bootstrap集成Bootstrap](#3.2 使用Flask-Bootstrap集成Bootstrap)
-
- [Bootstrap 是什么?网页美化工具包](#Bootstrap 是什么?网页美化工具包)
- [Flask-Bootstrap 的作用:把bootstrp包装成jinja2可用的模板,从而实现模板继承](#Flask-Bootstrap 的作用:把bootstrp包装成jinja2可用的模板,从而实现模板继承)
- [bootstrap = Bootstrap(app) 是Flask-Bootstrap的1种初始化方式。app是flask应用的实例](#bootstrap = Bootstrap(app) 是Flask-Bootstrap的1种初始化方式。app是flask应用的实例)
- 3.3自定义错误界面
-
- [@app.errorhandler(错误码) 就是注册一个"遇到这个错误就执行的函数"](#@app.errorhandler(错误码) 就是注册一个“遇到这个错误就执行的函数”)
-
- [@app.errorhandler(404) 页面不存在](#@app.errorhandler(404) 页面不存在)
- [@app.errorhandler(500) 服务器出错](#@app.errorhandler(500) 服务器出错)
- 3.4 链接
-
- [视图函数名和端点名不一致时,只能使用端点名。Flask 只认端点名 来生成 URL](#视图函数名和端点名不一致时,只能使用端点名。Flask 只认端点名 来生成 URL)
- [为什么不能直接写 URL?](#为什么不能直接写 URL?)
- [url_for() 用 端点名 生成 URL](#url_for() 用 端点名 生成 URL)
-
- [为什么 浏览器内导航 → 只需要相对 URL 就够了?相对url指不带域名和端口](#为什么 浏览器内导航 → 只需要相对 URL 就够了?相对url指不带域名和端口)
- [动态路由和 url_for()](#动态路由和 url_for())
- 添加查询参数
- [3.5 静态文件](#3.5 静态文件)
-
- 什么叫「静态文件」?
- [Flask 默认有一个 /static/<filename> 路由](#Flask 默认有一个 /static/
路由) - 默认设置下,Flask在应用目录中名为static的子目录中寻找静态文件。应用目录是哪个?创建flask对象的那个python文件所在的目录
- [为什么要用 url_for('static', ...)?](#为什么要用 url_for('static', ...)?)
- [url_for('static', ...) 是什么意思?static:static路由端点名filename:static 文件夹里的路径](#url_for('static', ...) 是什么意思?static:static路由端点名filename:static 文件夹里的路径)
- [link icon指定浏览器标签页左上角的小图标](#link icon指定浏览器标签页左上角的小图标)
-
- [`<link> `永远写在 `<head>` 里,使用xx类型的外部资源,它的位置在xx](#
<link>永远写在<head>里,使用xx类型的外部资源,它的位置在xx) -
- [href = hyper reference(超链接引用),告诉浏览器:那个资源"在哪里"](#href = hyper reference(超链接引用),告诉浏览器:那个资源“在哪里”)
-
- [icon 就是我们说的 网站图标](#icon 就是我们说的 网站图标)
- [rel="stylesheet" 页面的样式](#rel="stylesheet" 页面的样式)
- rel="preload"提前加载一个资源
- [为什么不是 src?src:把资源"塞进"页面,href:建立引用关系](#为什么不是 src?src:把资源“塞进”页面,href:建立引用关系)
- [rel 决定"是什么关系"](#rel 决定“是什么关系”)
- 为什么不是页面里的某个图标?
- [`<link> `永远写在 `<head>` 里,使用xx类型的外部资源,它的位置在xx](#
- 使用Flask-Moment本地化日期和时间
-
- [数据库存 UTC。服务器用 UTC。浏览器负责显示本地时间](#数据库存 UTC。服务器用 UTC。浏览器负责显示本地时间)
- [初始化Flask-Moment。创建实例并绑定 Flask 应用](#初始化Flask-Moment。创建实例并绑定 Flask 应用)
- [Flask-Moment(flask扩展,在模板中处理和显示时间) 和依赖](#Flask-Moment(flask扩展,在模板中处理和显示时间) 和依赖)
-
- [moment.include_moment() 在 HTML 里插入加载 Moment.js 的 <script> 标签](#moment.include_moment() 在 HTML 里插入加载 Moment.js 的