1.模板结构组织

1.1 局部模板

局部模板仅包含部分代码,用来插入到其他独立模板

{% include 'banner.html' %} #将banner.html的内容插入
复制代码

1.2 宏(macro)

使用宏将一部分模板代码封装到宏中,使用传递的参数来构建内容,最后返回构建的内容。

为了方便管理,我们把宏存储在单独的文件中,这个文件通常命名为macros.html 或 _macors.html。示例如下:

{% mcro qux(amount=1) %}{% if amount == 1 %}I am qux.{% elif amount > 1 %}We are quxs.{% endif %}
{% endmacro %}
复制代码

在模板中使用宏:

{% from 'macros.html' import qux %}
...
{{ qux(amount=5 )}}
复制代码

1.3 模板继承

1.3.1 编写基模板

基模板存储了程序页面的固定部分

#base.html
<!DOCTYPE html>
<html>
<head>{% block head %}<meta charset="utf-8"><title>{% block title %}Template - HelloFlask{% endblock %}</title>{% block styles %} {% endblock %}{% endblock %}
</head>
<body>
<nav><ul><li><a href="{{ url_for('index') }}">Home</a></li></ul>
</nav>
<main>{% block content %}{% endblock %}
</main>
<footer>{% block footer %}...{% endblock %}
</footer>
{% block scripts %}{% endblock %}
</body>
</html>
复制代码
1.3.2 编写子模板
#index.html
{% extends 'base.html' %}
{% from 'macros.html' import qux %}
{% block content %}
{% set name='baz' %}
<h1>template</h1>
<ul><li><a href="{{ url_for('watchlist') }}">Watchlist</a></li><li>Filter: {{ foo|musical }}</li><li>Global: {{ bar() }}</li><li>Test: {% if name is baz %}I am baz.{% endif %}</li><li>Macro: {{ qux(amount=1) }}</li><li><a href="{{ url_for('watchlist_with_static') }}">Watchlist with image and styles.</a></li><li><a href="{{ url_for('just_flash') }}">Flash something</a></li>
</ul>
{% endblock %}
复制代码

在子模板中,我们可以对父模板中的块执行两种操作:

a.覆盖内容

b.追加内容

{% block styles %}
{{ super() }}
<style>.foo{color:red;}
</style>
<% endblock %>
复制代码

2.模板进阶实践

2.1 加载静态文件

在Flask程序中,默认我们将静态文件储存在与主脚本同级目录的static文件夹。

若在static目录下保存了一个img.jpg,我们使用下面代码获取文件的URL

url_for('static',filename='img.jpg')
复制代码

2.2 消息闪现

Flask提供了一个flash()函数,它可以用来"闪现"需要显示给用户的信息。使用flash函数发送的信息是存储在session中,我们需要在模板中用get_flashed_message()函数获取信息并将其显示出来。

#app.py使用flash()函数"闪现"消息
from flask import Flask,render_template,flash
app=Flask(__name__)
app.secret_key='secret string'
@app.route('/flash')
def just_flash():flash('I am flash,who is looking for me?')return redirect(url_for('index'))
复制代码

Flask提供了get_flashed_message()函数用来在模板里获取信息。当函数被调用后,session里面存储的所有信息都会被移除。

#base.html:渲染flash信息
<main>{% for message in get_flashed_messages() %}<div class="alert">{{ message }}</div>{% endfor %}{% block content %}{% endblock %}
</main>
复制代码

2.3 自定义错误页面

我们先创建错误页面的模板

#404.html:404页面模板
{% extends 'base.html' %}
{% block title %}404- Page Not Found {% endblock %}
{% block content %}
<h1>Page Not Found</h1>
<p>You are lost</p>
{% endblock %}
复制代码

创建错误处理器

#app.py:404错误处理器
from flask import Flask, render_template
...
@app.errorhandler(404) #参数为错误状态码
def page_not_found(e):return render_template('errors/404.html'),404
复制代码

2.4 JavaScript和CSS中的Jinja2

只有使用render_template()传入的模板文件才会被渲染,就算我们在HTML导入了JavaScript和CSS,它们包含的Jinja2代码也不会执行。我们可以用以下几种方法解决

1.行内/嵌入式JavaScript/CSS

这种方法不推荐,行内/嵌入式JavaScript/CSS会使维护变得困难。解决方法是尽量将要使用的Jinja2变量值在HTML模板中定义为JavaScript变量.

2.定义为JavaScript变量

对于想要在JavaScript获取的数据,如果是元素特定的数据,可以使用HTML元素的data-*属性存储。

我们可以自定义横线后面的名称,作为元素上的自定义数据变量。

<span data-id="{{ user.id }}">{{ user.username }}
</sapn>
复制代码

在Java Script中,我们使用DOM元素的dataset属性获取data-*属性值

element.dataset.username
复制代码

或是使用getAttribute()方法

element.getAttribute('data-username')
复制代码

使用jQuery时,直接对jQuery对象调用data方法获取

$element.data('username')
复制代码

注:在HTML中,data-*被称为自定义数据属性,我们可以用它来存储自定义的数据供JavaScript获取。

3.定义为CSS变量

#定义为CSS变量
<style>
:root{--theme-color: {{ theme_color }}--background-url:{{ url_for('static',filename='background.jpg') }}
}
</style>
复制代码

在CSS文件中,使用var()函数并传入变量名即可获取对应的变量值:

#foo {color:var(--theme-color);
}
#bar {background:var(--background-url);
}复制代码

转载于:https://juejin.im/post/5cd007df51882540d472ae44

Flask入门学习---进一步了解模板相关推荐

  1. Flask入门学习---初步了解模板

    1.为什么需要模板引擎(template engine)? 在上面的例子中,我们视图函数向客户端返回一行HTML代码.当有大量HTML代码的时候,我们应该将它们都存储在一个文件里面,从而让控制器和用户 ...

  2. Flask入门学习教程

    Flask学习 文章目录 Flask学习 1.简介 2.安装 3.最小的应用 4.路由 5.变量规则 6.URL构建 7.HTTP方法 8.文件存放 9.渲染模板 10.Request对象 11.Co ...

  3. Flask入门学习---Hello,Flask!

    实例程序在helloflask/demos/hello目录下 1.最小的Flask程序 在hello目录下的app.py脚本中包含了一个最小的Flask程序. from flask import Fl ...

  4. Flask入门系列(转载)

    一.入门系列: Flask入门系列(一)–Hello World 项目开发中,经常要写一些小系统来辅助,比如监控系统,配置系统等等.用传统的Java写,太笨重了,连PHP都嫌麻烦.一直在寻找一个轻量级 ...

  5. Flask框架学习整理——从零开始入门Flask

    文章目录 Flask框架 一. 简介 二. 概要 三. 知识点(附代码) 1. Flask基础入门 1)路由route的创建: 2)endpoint的作用 3)request对象的使用 4)请求钩子b ...

  6. Flask入门之Jinjia模板的一些语法

    原文:https://www.cnblogs.com/wongbingming/p/6807771.html Flask入门之Jinjia模板的一些语法 1. 变量表示 {{ argv }} 2. 赋 ...

  7. 学python有哪些用途-初入门学习python有哪些用途?

    python是人工智能的重要编程语言,无论发展前景还是就业方向,不可限量.更重要的是python还是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.那么初入门学习python有哪些用途呢 ...

  8. Docker入门学习教程

    Docker入门学习 文章目录 Docker入门学习 1.简介 2 基本概念 2.1 镜像(Image) 2.2 容器(Container) 2.3 仓库(Repository) 3.Windows ...

  9. 最全面的openGL 入门学习

    自己在找openGL学习资料的时候,找到此篇openGL入门学习(虽然不是移动开发,但给我提供了非常好的思路),所以转一下让更多人知道,本文来自http://www.cppblog.com/doing ...

  10. OpenGL编程入门学习

    OpenGL编程入门学习  非常详细的教程,很适合初学者 本文转自:http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html === ...

最新文章

  1. ASP.NET MVC下的异步Action的定义和执行原理
  2. 埋点套路深,千万别掉“坑”
  3. 从头开始复习css之2D变换
  4. AndroidStudio 3.4更新了啥?(转载)
  5. 数据结构—单链表(类C语言描写叙述)
  6. java 日本时区_java时区时间ZoneOffset, ZoneId,OffsetTime,OffsetDateTi
  7. 不干胶设计用什么软件制作_用什么软件制作抖音短视频会比较好?
  8. Kernel Method: 6.再生核希尔伯特空间理论
  9. Win10命令提示符快捷键汇总
  10. 系统集成方案(一).NET集成方案
  11. android 系统重新安装,一招学会安卓手机系统重装教程
  12. Spring Cloud与Dubbo详细对比
  13. linux添加core文件位置,Linux生成core文件、core文件路径设置
  14. 动网新闻系统IWMS中实现带标题幻灯片的功能效果
  15. 深入理解 OpenStack Neutron:VXLAN
  16. 奋斗吧,程序员——第四十五章 柔情似水,佳期如梦
  17. 高分辨率实时抠像-RobustVideoMatting飞桨复现
  18. 考研这么累,能支持你坚持到底的是什么?
  19. Oracle数据库操作命令
  20. 【 网络带宽 】MBps Mbps

热门文章

  1. python_07 函数作用域、匿名函数
  2. Git----远程仓库之添加远程库02
  3. getResource()和getResourceAsStream以及路径问题
  4. 利用反射来实现动态代理
  5. 给你的应用“一只”智慧的眼睛 —— Barcode常识普及以及识别信息处理
  6. 设置数据库及表的默认字符集
  7. 基于嵌入式linux路由转发功能的实现
  8. FORM开发实现动态LOV
  9. 2b青年欢乐多之地铁奇幻记
  10. MS SQL Server 2000 游标的使用方法