1、模板的使用

1.1  语法

1.1.1 流程控制

逻辑语法

Jinja2模板语言中的 for

{% for foo in g %}

{% endfor %}

Jinja2模板语言中的 if

{% if g %}

{% elif g %}

{% else %}

{% endif %}

1.1.2 变量#

{{}} 

1.2 实例

数据准备

后端定义几个字符串,用于传递到前端

STUDENT = {'name': 'Old', 'age': 38, 'gender': '中'},

STUDENT_LIST = [
{'name': 'Old', 'age': 38, 'gender': '中'},
{'name': 'Boy', 'age': 73, 'gender': '男'},
{'name': 'EDU', 'age': 84, 'gender': '女'}
] STUDENT_DICT = {
1: {'name': 'Old', 'age': 38, 'gender': '中'},
2: {'name': 'Boy', 'age': 73, 'gender': '男'},
3: {'name': 'EDU', 'age': 84, 'gender': '女'},
}

1.2.1. 使用STUDENT字典传递至前端#

前端页面

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1px">
<thead>
<tr>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
</tr>
</thead>
<tbody>
{% for foo in stu %}
<tr>
<td>{{ foo.name }}</td>
<td>{{ foo.age }}</td>
<td>{{ foo.gender }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>

后端代码

from flask import Flask,render_template,request
app = Flask(__name__)
STUDENT = {'name': 'Old', 'age': 38, 'gender': '中'}, @app.route('/login',methods=["POST","GET"])
def login():
if request.method == "GET":
return render_template("login.html",stu=STUDENT) if __name__ == '__main__':
app.run("0.0.0.0", 9876)

1.2.2. STUDENT_LIST 列表传入前端Jinja2 模板的操作

前端页面

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1px">
<thead>
<tr>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
</tr>
</thead>
<tbody>
{% for foo in stu %}
<tr>
<td>{{ foo.get("name") }}</td>
<td>{{ foo.age }}</td>
<td>{{ foo["gender"] }}</td>
</tr>
{% endfor %} </tbody>
</table> </body>
</html>

上面我们用了三种取值方式,这里foo就是每个字典

后端代码

from flask import Flask,render_template,request
app = Flask(__name__) STUDENT_LIST = [
{'name': 'Old', 'age': 38, 'gender': '中'},
{'name': 'Boy', 'age': 73, 'gender': '男'},
{'name': 'EDU', 'age': 84, 'gender': '女'}
] @app.route('/login',methods=["POST","GET"])
def login():
if request.method == "GET":
return render_template("login.html",stu=STUDENT_LIST) if __name__ == '__main__':
app.run("0.0.0.0", 9876)

1.2.3 STUDENT_DICT 大字典传入前端 Jinja2 模板#

前端页面

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1px">
<thead>
<tr>
<th>序号</th>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
</tr>
</thead>
<tbody>
{% for foo in stu %}
<tr>
<td>{{ foo }}</td>
<td>{{ stu.get(foo).name }}</td>
<td>{{ stu.get(foo).age }}</td>
<td>{{ stu.get(foo).gender }}</td> </tr>
{% endfor %} </tbody>
</table> </body>
</html>

后端代码

from flask import Flask,render_template,request
app = Flask(__name__) STUDENT_DICT = {
1: {'name': 'Old', 'age': 38, 'gender': '中'},
2: {'name': 'Boy', 'age': 73, 'gender': '男'},
3: {'name': 'EDU', 'age': 84, 'gender': '女'},
}
@app.route('/login',methods=["POST","GET"])
def login():
if request.method == "GET":
return render_template("login.html",stu=STUDENT_DICT) if __name__ == '__main__':
app.run("0.0.0.0", 9876)

在遍历字典的时候,foo 其实是相当于拿出了字典中的Key

1.2.4 Markup#

该方法和django中的safe一样都是防止xss攻击、

from flask import Flask,render_template,request
from markupsafe import Markup app = Flask(__name__) @app.route('/login',methods=["POST","GET"])
def login():
if request.method == "GET":
my_in = Markup("<input type='text' name='uname'>")
return render_template("login.html",ss=my_in) if __name__ == '__main__':
app.run("0.0.0.0", 9876)

前端页面生成的标签:

<input type="text" name="uname">

1.4 模板继承

模板继承语法:

使用‘extend’语句,来指明继承的父模板。

示例代码:

{% extends 'base.html' %}

block语法:

一般在父模版中,定义一些公共的代码。子模版可能要根据具体的需求实现不同的代码。

这时候父模版就应该提供一个接口,让父模版来实现。从而实现具体业务需求的功能。

在父模版中:

{% block block的名字 %}
{% endblock %}

在子模版中:

{% extends 'base.html' %}
{% block body_block %}
子模板代码
{% endblock %}

调用父模版的代码block中的代码:

默认情况下,子模版如果实现了父模版定义的block,那么子模版block中的代码就会覆盖掉父模版中的代码,如果想在子模版中仍然保持父模版代码,需要用super() 函数调用。具体代码如下:

{% block body_block %}
{{ super() }} {#super()调用父模版代码#}
<p style="background-color: green;">首页子模板代码</p>
{% endblock %}

调用另一个block中的代码:

一个模板中使用其他模板的代码。那么可以通过'{{ self.其他block名字() }}'

示例代码如下:

{% block another_block %}
我是另一个模板的代码
{% endblock %}
{% block body_block %}
{{ self.another_block() }}
<p style="background-color: green;">首页子模板代码</p>
{% endblock %}

其他注意事项:

  1. 子模版中的代码,第一行应该是继承的代码。'extends'.

  2. 子模版中,如果要实现自己的代码,应该放到block中,如果放到外面,将无法被渲染。

2、自定义模板方法

Flask中自定义模板方法的方式和Bottle相似,创建一个函数并通过参数的形式传入render_template,如:

#login.html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>自定义函数</h1>
{{ww()|safe}} </body>
</html> html
# run.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask,render_template
app = Flask(__name__) def wupeiqi():
return '<h1>Wupeiqi</h1>' @app.route('/login', methods=['GET', 'POST'])
def login():
return render_template('login.html', ww=wupeiqi) app.run()

其他

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> {% macro input(name, type='text', value='') %}
<input type="{{ type }}" name="{{ name }}" value="{{ value }}">
{% endmacro %} {{ input('n1') }} {% include 'tp.html' %} <h1>asdf{{ v.k1}}</h1>
</body>
</html>

过滤器

使用方式: 变量名|过滤器

{{variable | filter_name(*args)}}

如果没有任何参数传给过滤器,则可以把括号省略掉
在 jinja2 中,过滤器是可以支持链式调用的,

示例如下{{ "hello world" | reverse | upper }}

flask自带的过滤器

字符串操作
禁用转义: {{ '<em>hello</em>' | safe }}
删除标签: {{ '<em>hello</em>' | striptags }}
首字母大写: {{ 'hello' | capitalize }}
所有值小写: {{ 'HELLO' | lower }}
首字母大写: {{ 'hello world' | title }}
字符串反转: {{ 'hello' | reverse }}
字符串截断: {{ 'hello world' | truncate(5) }}

列表操作
获取列表长度: {{ [1,2,3,4,5,6] | length }}
列表求和: {{ [1,2,3,4,5,6] | sum }}
列表排序: {{ [6,2,3,1,5,4] | sort }}

自定义过滤器

方式一:

通过Flask应用对象的add_template_filter方法

def list_reverse(li):
temp = list(li)
temp.reverse()
return temp # 可以给过滤器器一个名字,如果没有,默认就是函数的名字
app.add_template_filter(list_reverse,'li_reverse')
方式二:

通过装饰器来实现自定义过滤器

# 使用装饰器事项过滤器,
# 如果不传入参数,默认过滤器名字就是函数的名字
@app.template_filter()
def my_filter(args):
temp = list(args)
temp.reverse()
return temp
在html模板中调用过滤器:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jinjia2模板测试</title>
</head>
<body>
<h1>len: {{ [1,2,3,4,5,6] | length }}</h1> #此处调用上文flask自带的过滤器
<h1> {{ [1,2,3,4,5,6] | my_filter }}</h1> #此处调用上文自定义过滤器 </body>
</html>
 

xss,csrf,json 攻击

https://www.cnblogs.com/shengulong/p/7693107.html

{{variable | filter_name(*args)}}

如果没有任何参数传给过滤器,则可以把括号省略掉
在 jinja2 中,过滤器是可以支持链式调用的,示例如下

{{ "hello world" | reverse | upper }}

作者:Gavininn
链接:https://www.jianshu.com/p/1ae7d2c3c223
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Flask 基础组件(四):模板的更多相关文章

  1. flask基础之jijia2模板语言进阶(三)

    前言 前面学习了jijia2模板语言的一些基础知识,接下来继续深挖jijia2语言的用法. 系列文章 flask基础之安装和使用入门(一) flask基础之jijia2模板使用基础(二) 控制语句 和 ...

  2. flask基础之jijia2模板使用基础(二)

    前言 在以前前后端不分离的时代,后台程序员往往又当爹又当妈,需要将前端程序员写的h5页面填充模板语言.而jijia2是一门十分强大的python的模板语言,是flask框架的核心模块之一.先简单介绍一 ...

  3. Flask 基础组件(七):蓝图

    1 蓝图资源 蓝图有自己的目录,它的所有资源都在其目录下.蓝图的资源目录是由创建Blueprint对象时传入的模块名”__name__”所在的位置决定的.同时,我们可以指定蓝图自己的模板目录和静态目录 ...

  4. Flask 基础组件(一):基本使用

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  5. 测开之路二十九:Flask基础之jinja2模板

    中文文档:http://docs.jinkan.org/docs/jinja2/ 与静态资源一样,Flask默认的模板目录名为templates,如果有需要的话和static一样,要在初始化的时候声明 ...

  6. Flask 基础组件(六):Session

    除请求对象之外,还有一个 session 对象.它允许你在不同请求间存储特定用户的信息.它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使用会话,你需要设置一个密钥. 设 ...

  7. Flask 基础组件(五):请求和响应

    from flask import Flask from flask import request from flask import render_template from flask impor ...

  8. 测开之路三十:Flask基础之jinja2模板继承

    实现某些位置的内容固定,某些位置的内容动态展示,如: 中文文档地址:http://docs.jinkan.org/docs/jinja2/templates.html#template-inherit ...

  9. Flask 基础组件(十):中间件

    from flask import Flask, flash, redirect, render_template, request app = Flask(__name__) app.secret_ ...

随机推荐

  1. @codeforces - 549E@ Sasha Circle

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定两个点集 M 与 S,求是否存在一个圆能够分割两个点集. 原 ...

  2. DML_Data Modification_MERGE

    DML_8-Data Modification_MERGE (将Source表合并到Target) 语法:MERGE INTO 目标表USING 源表WHEN MATCHED AND          ...

  3. Python绘图之Turtle库详解(1)

    Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行 ...

  4. C#数据结构与算法系列(五):常见单链表笔试

    1.求单链表中有效节点个数 public static int GetLength(HeroNode headNode) { int length = ; var cur = headNode.Nex ...

  5. Scrapy学习1:安装

    Install Scrapy 熟悉PyPI的话,直接一句 pip install Scrapy 但是有时候需要处理安装依赖,不能直接一句命令就安装结束,这个和系统有关. 我用的Ubuntu,这里仅介绍 ...

  6. MySQL 视图 事务 索引 外连接

    视图 1.定义 select 语句的结果集,是一张虚拟的表2.创建视图语句create view 视图名 as select语句3.查看视图show views;4.使用视图select * from ...

  7. Java并发编程-深入探讨synchronized实现原理

    synchronized这个关键字对应Java程序猿来说是非常的熟悉,只要遇到要解决线程安全问题的地方都会使用这个关键字.接下来一起来探讨一下synchronized到底时怎么实现线程同步,使用syn ...

  8. Blazor带我重玩前端(一)

    写在前面 曾经我和前端朋友聊天的时候,我说我希望有一天可以用C#写前端,不过当时更多的是美好的想象,而现在这一切正变得真实…… 什么是Blazor 我们知道浏览器可以正确解释并执行JavaScript ...

  9. 工业4.0:换热站最酷设计—— Web SCADA 工业组态软件界面

    前言 随着工业4.0的不断普及与发展,以及国民经济的飞速前进,我国的城市集中供热规模也不断扩大,科学的管理热力管网具有非常重大的经济和社会效益.目前热力系统,如换热站大都采用人工监控,人工监控不仅浪费 ...

  10. python3 闭包函数 装饰器

    闭包函数 1.闭:定义在函数内部的函数 2.包:内部函数引用了外部函数作用域的名字 在函数编程中经常用到闭包.闭包是什么,它是怎么产生的及用来解决什么问题呢.给出字面的定义先:闭包是由函数及其相关的引 ...