第3章模板

文章目录

  • [摘要,视图函数只负责请求 → 响应,业务逻辑(数据处理)和表现逻辑(HTML 页面生成)要分开,模板(Jinja2) 用来渲染页面 → 表现逻辑移到模板中](#摘要,视图函数只负责请求 → 响应,业务逻辑(数据处理)和表现逻辑(HTML 页面生成)要分开,模板(Jinja2) 用来渲染页面 → 表现逻辑移到模板中)
  • [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 变量)
    • 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 决定“是什么关系”)
      • 为什么不是页面里的某个图标?
  • 使用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 的