flask框架之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)
{{ double(2) }}
{{ (".").join(["a","b","c"]) }}
模版变量
{{}}
: 来表示变量名
Jinja2 模版中的变量代码块可以是任意 Python 类型或者对象,只要它能够被 Python 的 str() 方法转换为一个字符串就可以
比如,可以通过下面的方式显示一个字典或者列表中的某个元素
{{ object['key'] }}
{{ object.key }}
{{ object[0] }}
模版控制
{% %}
: 定义的控制代码块,可以实现一些语言层次的功能,比如循环或者if语句,类似django的模版语言哦
{% if 条件1 %}语句块1
{% elif 条件2 %}语句块2
{% else %}不符合所有条件
{% endif %}
{% for index in indexs if index!=1 %}<li> {{ index }} </li>
{% endfor %}
过滤器
过滤器的本质就是函数。有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化、运算等等,那么这就用到了过滤器
{{ object | filter}}
- 字符串过滤器
过滤器 | 说明 |
---|---|
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 %
自定义过滤器
如果你要在 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
在使用装饰器的情况下,如果你想以函数名作为过滤器名,参数是可选的。
注册之后, 你可以在模板中像使用 Jinja2 内置过滤器一样使用你的过滤器,例如你在上下文中有一个名为 mylist 的 Python 列表
{% for x in mylist | reverse %}
{% endfor %}
模版函数
如果你希望在模版中,可以使用一些常用的方法,但是为了不在每个视图都定义一次,那么可以使用template_global
将函数注册为模板全局函数
这样在每个模版里都可以很快乐的随意使用了
@app.template_global()
def length(s):return len(str(s))
使用还是老样子
{{ length("abc") }}
模版静态加载
如果希望在模版中加载静态资源,无非两种办法,第一种是使用相对路径
<link href="../static/bootstrap.css" rel="stylesheet">
第二种是动态获取路径,使用模版提供的url_for方法反向解析到static目录
{{ url_for("static", filename="bootstrap.css") }}
JinJa2模版重用
模版宏
宏类似于Python中的函数,宏的作用就是在模板中重复利用代码,避免代码冗余
Jinja2支持宏,还可以导入宏,需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板中,以避免重复
{% macro %}
: 定义个宏
{% macro macro_test(href) %}<h3>这是个宏</h3><a href="{{ href }}">这是链接</a>
{% endmacro %}
- 使用宏
{{ macro_test("https://baidu.com") }}
宏一般会定义为一个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>
- 使用这个宏文件
{% import 'macro_input.html' as macro_input %}
{{ macro_input.user_form("admin","123456") }}
模版继承
模板继承是为了重用模板中的公共内容
一般Web开发中,继承主要使用在网站的顶部菜单、底部。这些内容可以定义在父模板中,子模板直接继承,而不需要重复书写
{% block %}
标签定义的内容,相当于在父模板中挖个坑,当子模板继承父模板时,可以进行填充
- 父模版
{% block top %}顶部菜单 导入一系列css样式等
{% endblock top %}{% block content %}内容
{% endblock content %}{% block bottom %}底部 导入一系列js等
{% endblock bottom %}
- 子模版,使用
{% extends %}
标签引入父模版
{% extends 'base.html' %}
{% block content %}需要填充的内容
{% endblock content %}
- 注意
- 不支持多继承
- 为了便于阅读,在子模板中使用extends时,尽量写在模板的第一行
- 不能在一个模板文件中定义多个相同名字的block标签
- 当在页面中使用多个block标签时,建议给结束标签起个名字,当多个block嵌套时,阅读性更好
模版包含
Jinja2模板中,除了宏和继承,还支持一种代码重用的功能,叫包含{% include %}
它的功能是将另一个模板整个加载到当前模板中,并直接渲染
包含在使用时,如果包含的模板文件不存在时,程序会抛出TemplateNotFound
异常,可以加上ignore missing
关键字
如果包含的模板文件不存在,会忽略这条include
语句
{% include 'index.html' ignore missing %}
宏(Macro)、继承(Block)、包含(include)均能实现代码的复用。
继承(Block)的本质是代码替换,一般用来实现多个页面中重复不变的区域。
宏(Macro)的功能类似函数,可以传入参数,需要定义、调用。
包含(include)是直接将目标模板文件整个渲染出来。
flask框架之jinjia2模版语法详解相关推荐
- python语言的格式框架_django框架模板语言使用方法详解
本文实例讲述了django框架模板语言使用方法.分享给大家供大家参考,具体如下: 模板功能 作用:生成html界面内容,模版致力于界面如何显示,而不是程序逻辑.模板不仅仅是一个html文件,还包括了页 ...
- 微信小程序python flask_Python Flask 搭建微信小程序后台详解
前言: 近期需要开发一个打分的微信小程序,涉及到与后台服务器的数据交互,因为业务逻辑相对简单,故选择Python的轻量化web框架Flask来搭建后台程序.因为是初次接触小程序,经过一番摸索和尝试,个 ...
- Python的Xpath介绍和语法详解
1.简介 XPath是一门在XML和HTML文档中查找信息的语言,可以用来在XML和HTML文档中对元素和属性进行遍历 XPath的安装 Chrome插件XPath Helper 点Chrome浏览器 ...
- FreeMarker基本语法详解及模板文件的组成(二)
海浪上次给大家分享了FreeMarker基本语法详解及模板文件的组成(一)海浪今天继续分享FreeMarker基本语法详解及模板文件的组成(二) 3.2 输出变量值<?xml:namespace ...
- Velocity魔法堂系列二:VTL语法详解
一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...
- Java8初体验(二)Stream语法详解(转)
本文转自http://ifeve.com/stream/ Java8初体验(二)Stream语法详解 感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com 上篇文章Java8初体验( ...
- python编程语法大全-Python编程入门——基础语法详解
今天小编给大家带来Python编程入门--基础语法详解. 关于怎么快速学python,可以加下小编的python学习群:611+530+101,不管你是小白还是大牛,小编我都欢迎,不定期分享干货 每天 ...
- python编程语法-Python编程入门——基础语法详解
今天小编给大家带来Python编程入门--基础语法详解. 一.基本概念 1.内置的变量类型: Python是有变量类型的,而且会强制检查变量类型.内置的变量类型有如下几种: #浮点 float_num ...
- python编程if语法-Python编程入门基础语法详解经典
原标题:Python编程入门基础语法详解经典 一.基本概念 1.内置的变量类型: Python是有变量类型的,而且会强制检查变量类型.内置的变量类型有如下几种: #浮点 float_number = ...
- python编程语法-Python编程入门——基础语法详解(经典)
今天小编给大家带来Python编程入门--基础语法详解.温馨提示: 亮点在最后! 在这里还是要推荐下我自己建的Python开发学习群:301056051,群里都是学Python开发的,如果你正在学习P ...
最新文章
- C语言函数集(十二)
- C语言实现类似QQ聊天界面抖动功能
- ORA-28000: the account is locked 解决方法
- EZNEW.NET开发框架100%重磅开源
- thinkphp mysql函数_thinkphp对数据库操作有哪些内置函数
- AOS编排语言系列教程(二):初识AOS编排语言,创建你的第一个AOS模板
- numpy linspace
- [MetalKit]47-Introducing Metal 3 Metal 3简介
- oracle+调整+表空间,oracle数据库表空间及权限调整示例
- 目标检测面试问题非极大值抑制
- 禁止暴风影音stormtray.exe进程
- 【入门讲解】Python使用OpenCV设置图片尺寸。
- dcdc aam模式_AAM的完整形式是什么?
- Android Studio常用快捷键
- java控制订单过期时间_订单自动过期实现方案
- python的拼音_GitHub - mozillazg/python-pinyin: 汉字转拼音(pypinyin)
- A-level Computer Science 计算机科学学习笔记/经验分享/教学 (1):考试流程和大纲
- Java初学多种数据类型接收方法总结
- 面试积累(简单的工厂模式)
- 操作系统调度算法--高响应比优先调度算法解析
热门文章
- AutoCAD Civil 3D 中缓和曲线的定义
- 二级路由添加网络打印机的方法
- Arduino 利用ADS1115 AD转换模块进行数据读取
- 我的计算机无法远程连接桌面,远程桌面无法连接怎么办?windows 无法使用远程桌面连接的解决方法...
- AI在医疗领域的应用 | “AI+传统行业”全盘点
- CCD实际尺寸对照表
- httpd三种MPM的原理剖析
- 分号在各种编程语言中的作用
- PowerDesigner使用教程 —— 概念数据模型(CDM模型)
- 计算机毕业设计——简单的网页设计HTML+CSS+JavaScript