jinjia2基本用法
前言
这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题
于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。
微信小程序搜索:Python面试宝典
或可关注原创个人博客:https://lienze.tech
也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习
JinJa2模版语法
Jinja 2 默认配置如下:
所有扩展名为 .html 、 .htm 、 .xml 以及 .xhtml 的模板会开启自动转义
模板可以利用 {% autoescape %} 标签选择自动转义的开关。
Flask 在 Jinja2 上下文中插入了几个全局函数和助手,另外还有一些目前默认的值
于django的模版语言template类似,但是更强大,还可以支持函数传递,模版中的函数调用,并且传递参数等
...
return render_template("index.html", double=lambda x : x * 2)
1
2
{{ double(2) }}
{{ (".").join(["a","b","c"]) }}
1
2
模版变量
{{}}: 来表示变量名
Jinja2 模版中的变量代码块可以是任意 Python 类型或者对象,只要它能够被 Python 的 str() 方法转换为一个字符串就可以
比如,可以通过下面的方式显示一个字典或者列表中的某个元素
{{ object['key'] }}
{{ object.key }}
{{ object[0] }}
1
2
3
模版控制
{% %}: 定义的控制代码块,可以实现一些语言层次的功能,比如循环或者if语句,类似django的模版语言哦
{% if 条件1 %}
语句块1
{% elif 条件2 %}
语句块2
{% else %}
不符合所有条件
{% endif %}
1
2
3
4
5
6
7
{% for index in indexs if index!=1 %}
<li> {{ index }} </li>
{% endfor %}
1
2
3
过滤器
过滤器的本质就是函数。有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化、运算等等,那么这就用到了过滤器
{{ object | filter}}
1
字符串过滤器
过滤器 说明
safe 禁止转义,渲染时不会转义特殊字符
capitallize 把首字母转大写,其他的字母转小写
lower 把所有的字母转小写
upper 把所有字母转大写
title 把每个单词的首字母转大写
trim 去掉首尾空格
striptags 去掉所有的HTML标签
join 将多个值拼接成字符串,类似python的join()函数
replace 替换字符串的值
round 对数字四舍五入
int 转换成int类型
列表过滤器
过滤器 说明
first 获取列表的第一个元素
last 获取列表的最后一个
sort 排序列表
sum 列表求和
length 列表的长度
模版上下文
下面的全局变量默认在 Jinja2 模板中可用:
config
当前的配置对象 (flask.config)0.6 新版功能.在 0.10 版更改: 现在这总是可用的,甚至在导入的模版里。
request
当前的请求对象 (flask.request)。当模版不是在活动的请求上下文中渲染时这个变量不可用。
session
当前的会话对象 (flask.session)。当模版不是在活动的请求上下文中渲染时这个变量不可用。
g
请求相关的全局变量 (flask.g)。当模版不是在活动的请求上下文中渲染时这个变量不可用。
url_for()
flask.url_for() 函数
get_flashed_messages()
flask.get_flashed_messages() 函数
自动转义
自动转义的概念是自动转义特殊字符。 HTML (或 XML ,因此也有 XHTML )意义下的特殊字符是 & , > , < , " 以及 '
因为这些字符在文档中表示它们特定的含义,如果你想在文本中使用它们,应该把它们替换成相应的“实体”。不这么做不仅会导致用户疲于在文本中使用这些字符,也会导致安全问题。 (见 跨站脚本攻击(XSS) )
虽然你有时会需要在模板中禁用自动转义,比如在页面中显式地插入 HTML , 可以是一个来自于 markdown 到 HTML 转换器的安全输出
我们有三种可行的解决方案:
在传递到模板之前,用 Markup 对象封装 HTML字符串。一般推荐这个方法
在模板中,使用 |safe 过滤器显式地标记一个字符串为安全的 HTML ( {{ myvariable|safe }} )
临时地完全禁用自动转义系统
在模板中禁用自动转义系统,可以使用 {%autoescape %}
{% autoescape false %}
<p>autoescaping is disabled here
<p>{{ will_not_be_escaped }}
{% endautoescape %
1
2
3
4
自定义过滤器
如果你要在 Jinja2 中注册你自己的过滤器,你有两种方法。你可以把它们手动添加到应用的 jinja_env 或者使用 template_filter() 装饰器。
下面两个例子作用相同,都是反转一个对象
@app.template_filter('reverse')
def reverse_filter(s):
return s[::-1]
def reverse_filter(s):
return s[::-1]
app.jinja_env.filters['reverse'] = reverse_filter
1
2
3
4
5
6
7
在使用装饰器的情况下,如果你想以函数名作为过滤器名,参数是可选的。
注册之后, 你可以在模板中像使用 Jinja2 内置过滤器一样使用你的过滤器,例如你在上下文中有一个名为 mylist 的 Python 列表
{% for x in mylist | reverse %}
{% endfor %}
1
2
模版函数
如果你希望在模版中,可以使用一些常用的方法,但是为了不在每个视图都定义一次,那么可以使用template_global将函数注册为模板全局函数
这样在每个模版里都可以很快乐的随意使用了
@app.template_global()
def length(s):
return len(str(s))
1
2
3
使用还是老样子
{{ length("abc") }}
1
模版静态加载
如果希望在模版中加载静态资源,无非两种办法,第一种是使用相对路径
<link href="../static/bootstrap.css" rel="stylesheet">
1
第二种是动态获取路径,使用模版提供的url_for方法反向解析到static目录
{{ url_for("static", filename="bootstrap.css") }}
1
JinJa2模版重用
模版宏
宏类似于Python中的函数,宏的作用就是在模板中重复利用代码,避免代码冗余
Jinja2支持宏,还可以导入宏,需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板中,以避免重复
{% macro %}: 定义个宏
{% macro macro_test(href) %}
<h3>这是个宏</h3>
<a href="{{ href }}">这是链接</a>
{% endmacro %}
1
2
3
4
使用宏
{{ macro_test("https://baidu.com") }}
1
宏一般会定义为一个html文件,在其他模版中可以导入使用
定义一个测试宏文件macro_input.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% macro user_form(username,password) %}
<input type="text" name="username" value="{{ username }}">
<input type="password" name="password" value="{{ password }}">
<input type="submit" value="submit">
{% endmacro %}
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
使用这个宏文件
{% import 'macro_input.html' as macro_input %}
{{ macro_input.user_form("admin","123456") }}
1
2
模版继承
模板继承是为了重用模板中的公共内容
一般Web开发中,继承主要使用在网站的顶部菜单、底部。这些内容可以定义在父模板中,子模板直接继承,而不需要重复书写
{% block %}标签定义的内容,相当于在父模板中挖个坑,当子模板继承父模板时,可以进行填充
父模版
{% block top %}
顶部菜单 导入一系列css样式等
{% endblock top %}
{% block content %}
内容
{% endblock content %}
{% block bottom %}
底部 导入一系列js等
{% endblock bottom %}
1
2
3
4
5
6
7
8
9
10
11
子模版,使用{% extends %}标签引入父模版
{% extends 'base.html' %}
{% block content %}
需要填充的内容
{% endblock content %}
1
2
3
4
注意
不支持多继承
为了便于阅读,在子模板中使用extends时,尽量写在模板的第一行
不能在一个模板文件中定义多个相同名字的block标签
当在页面中使用多个block标签时,建议给结束标签起个名字,当多个block嵌套时,阅读性更好
模版包含
Jinja2模板中,除了宏和继承,还支持一种代码重用的功能,叫包含{% include %}
它的功能是将另一个模板整个加载到当前模板中,并直接渲染
包含在使用时,如果包含的模板文件不存在时,程序会抛出TemplateNotFound异常,可以加上ignore missing关键字
如果包含的模板文件不存在,会忽略这条include语句
{% include 'index.html' ignore missing %}
1
宏(Macro)、继承(Block)、包含(include)均能实现代码的复用。
继承(Block)的本质是代码替换,一般用来实现多个页面中重复不变的区域。
宏(Macro)的功能类似函数,可以传入参数,需要定义、调用。
包含(include)是直接将目标模板文件整个渲染出来。
jinjia2基本用法的更多相关文章
- 7、Flask实战第7天:Jinjia2模板
Jinja2模板介绍和查找路径 在前面的章节中,视图只是直接返回文本,然而在实际生产环境中其实很少这样用,因为实际的页面大多带有样式和复杂逻辑的HTML代码,这可以让浏览器其渲染出非常漂亮的页面. 我 ...
- Ansible 详细用法说明(二)
setup:获取指定主机的facts. ===================================facts就是变量,内建变量 .每个主机的各种信息,cpu颗数.内存大小等.会存在fact ...
- [Python自学] Flask框架 (1) (Flask介绍、配置、Session、路由、请求和响应、Jinjia2模板语言、视图装饰器)
oldboy:s9day114 参考博客:https://www.cnblogs.com/wupeiqi/articles/7552008.html 一.Flask简介 1.安装Flask pip i ...
- day94:flask:Jinjia2模板引擎&flask中的CSRF攻击&Flask-SQLAlchemy的创建模型类和基本的增删改查
目录 1.Jinjia2模板引擎 1.Jinjia2加载模板并传递数据到模板中 2.Jinjia2的模板语句 3.模板中特有的变量和函数 4.模板中内置的过滤器 5.自定义过滤器 6.模板继承 2.在 ...
- python jinjia2 使用语法
简介 对于jinjia2来说,模板仅仅是文本文件,可以生成任何基于文本的文件格式,例如HTML.XML.CSV.LaTex 等等,以下是基础的模板内容: <!DOCTYPE html> & ...
- EditText 基本用法
title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...
- jquery插件的用法之cookie 插件
一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法
一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...
- python enumerate 用法
A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...
随机推荐
- UE5农场项目小功能(1)-砍树
砍树功能效果的实现 在UE中想做一个砍树的功能,B站上没找到什么教程,最后在油管上找到个视频并跟着实现了,一共设计到三个蓝图和一个什么也没写的蓝图接口,下面介绍下步骤. 1.角色蓝图的部分 人物这 ...
- 微信支付 easy wechat 使用
/*微信小程序的配置信息微信商户信息*/ public function __construct(){ parent::__construct(); $this->OrderModel = ne ...
- 六、js创建页码器:分页、上一页下一页、省略页码
表格数据太多,需要做成分页.因此需要写一个页码器. 1,初始化页码 获取数据之后渲染页码器,页码器初始化,小于6页的全部展示,否则展示前四页,后面是省略号,最后展示尾页.默认选中第一页,禁用前一页的箭 ...
- python3GUI--用Tk开发一款恶搞蓝屏软件(附源码)
目录 一.准备工作 1.Tkinter 2.科普-电脑蓝屏 二.预览 1.蓝屏-win10.win11(中文版) 2.蓝屏-win10.win11(英文版) 3.Windows其他版本(XP.Win7 ...
- C++从键盘读取一行的方法
从键盘读取一行的方法 cin类中的成员函数getline()和get()--使用数组来处理字符串 cin.getline(数组,要读入的字符数).getline()将丢弃换行符.这个成员函数通过换行符 ...
- JVM - 1.内存结构
1 内存结构 1.1 程序计数器 1.1.1 作用 在执行的过程中 , 记住下一条jvm指令的执行地址 物理上通过寄存器实现 1.1.2 特性 每个线程都有自己的程序计数器 - 线程私有 不会存在内存 ...
- test.sh 监听进程是否存在
监听myloader进程是否结束,结束后把时间输出到 /root/time.log vim test.sh #!/bin/bash #确保PRO查询进程唯一 PRO="myloader&qu ...
- 【原创】android 7.0 通知报错 java.lang.SecurityException: You need MANAGE_USERS permission to: check if specified user a managed profile outside your profile group
项目中在后台发送通知,突然某一天测出在Android 7.0上通知发送失败,那么根据提示,我们尝试加了MANAGE_USERS权限,看起来是个系统级别权限,验证后果然无效.接着在搜索后都无果,似乎大家 ...
- MySql创建表遇到的问题
SQL语句如下: CREATE TABLE IF NOT EXISTS `student`{ `id` INT(4) NOT NULL COMMENT '学号', `name` VARCHAR(30) ...
- 过滤器函数 filtes 的使用总结
// import parseTime, formatTime and set to filter /** * Show plural label if time is plural number * ...