【python】Flask之模板引擎
一、模板介绍
1.1 视图函数
视图函数的主要作用是生成请求的响应,实际上视图函数有两个作用:
- 处理业务逻辑
- 返回响应内容
在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本
1.2 模板文件
按照一定的规则书写的展示效果的HTML文件
其实是一个包含响应文本的文件,其中用占位符(变量)表示动态部分,告诉模板引擎其具体的值需要从使用的数据中获取
1.3 模板引擎
负责按照指定规则进行替换的工具,使用真实值替换变量,再返回最终得到的字符串,这个过程称为’渲染’
Flask使用Jinja2这个模板引擎来渲染模板
1.4 模板的好处
- 视图函数只负责业务逻辑和数据处理(业务逻辑方面)
- 模板则取到视图函数的数据结果进行展示(试图展示方面)
- 代码结构清晰,耦合度低
二、Jinja2
2.1 两个概念
- Jinja2
Python中被广泛应用的模板引擎
由Python实现的模板语言,设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能,是Flask内置的模板语言 - 模板语言
一种被设计来自动生成文档的简单文本格式
在模板语言中,一般都会把一些变量传给模板,替换模板的特定位置上预先定义好的占位变量名
2.2 渲染模板函数
- Flask提供的
render_template
函数封装了该模板引擎 - render_template函数的第一个参数是模板的文件名,后面的参数都是键值对,表示模板中变量对应的真实值
@app.route('/user/<username>')
def index(username):return render_template('user.html',name=username)
三、使用
3.1 {{}}来表示变量名
这种{{}}语法叫做变量代码块
<h1>{{post.title}}</h1>
Jinja2模板中的变量代码块可以使任意Python类型或者对象,只要它能够被Python的str()方法转化为一个字符串,比如可以通过下面的方式显示一个字典或者列表中的某个元素
{{your_dict['key']}}
{{your_list[0]}}
3.2 用{%%}定义的控制代码块
可以实现一些语言层次的功能,比如循环语句
{% if user %}{{ user }}
{% else %}hello!
<ul>{% for index in indexs %}<li> {{ index }} </li>{% endfor %}
</ul>
3.3 注释
使用{##}进行注释,注释的内容不会在html中被渲染出来
{#{{ name }}#}
四、模板基本使用
- 在项目下创建templates文件夹,用于存放所有模板文件,并在目录下创建一个模板文件html文件
temp_demo1.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
我的模板html内容
</body>
</html>
- 设置templates文件夹属性以便能够在代码中有智能提示
- 设置html中的模板语言,以便在html有智能提示
- 创建视图函数,将该模板内容进行渲染返回
@app.route('/')
def index():return render_template('temp_demo1.html')
访问: htpp://127.0.0.1:5000/运行测试
五、模板变量
- 代码中传入字符串、列表、字典到模板中
@app.route('/')
def index():# 往模板中传入的数据my_str = 'Hello Word'my_int = 10my_array = [3, 4, 2, 1, 7, 9]my_dict = {'name': 'xiaoming','age': 18}return render_template('temp_demo1.html',my_str=my_str,my_int=my_int,my_array=my_array,my_dict=my_dict)
- 模板中代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
我的模板html内容
<br/>{{ my_str }}
<br/>{{ my_int }}
<br/>{{ my_array }}
<br/>{{ my_dict }}</body>
</html>
- 运行效果
我的模板html内容
Hello 黑马程序员
10
[3, 4, 2, 1, 7, 9]
{'name': 'xiaoming', 'age': 18}
- 相关运算,取值
<br/> my_int + 10 的和为:{{ my_int + 10 }}
<br/> my_int + my_array第0个值的和为:{{ my_int + my_array[0] }}
<br/> my_array 第0个值为:{{ my_array[0] }}
<br/> my_array 第1个值为:{{ my_array.1 }}
<br/> my_dict 中 name 的值为:{{ my_dict['name'] }}
<br/> my_dict 中 age 的值为:{{ my_dict.age }}
- 结果
my_int + 10 的和为:20
my_int + my_array第0个值的和为:13
my_array 第0个值为:3
my_array 第1个值为:4
my_dict 中 name 的值为:xiaoming
my_dict 中 age 的值为:18
示例代码
from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
def index():my_int = 18my_str = 'curry'my_list = [1, 5, 4, 3, 2]my_dict = {'name': 'durant','age': 28}# render_template方法:渲染模板# 参数1: 模板名称 参数n: 传到模板里的数据return render_template('01_template.html',my_int=my_int,my_str=my_str,my_list=my_list,my_dict=my_dict)if __name__ == '__main__':app.run(debug=True)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h2>我是模板</h2>
{{ my_int }}
<br>
{{ my_str }}
<br>
{{ my_list }}
<br>
{{ my_dict }}
<hr>
<h2>模板的list数据获取</h2>
<hr>
{{ my_list[0] }}
<br>
{{ my_list.1 }}
<hr>
<h2>字典数据获取</h2>
<hr>
{{ my_dict['name'] }}
<br>
{{ my_dict.age }}
<hr>
<h2>算术运算</h2>
<br>
{{ my_list.0 + 10 }}
<br>
{{ my_list[0] + my_list.1 }}
</body>
</html>
六、过滤器
过滤器本质就是函数
有时候不仅仅只是需要输出变量的值,还需要修改变量的显示,甚至格式化、运算等等,而在模板中是不能直接调用Python中的某些方法,那么这就用到了过滤器
使用方法:
过滤器的使用方法为:变量名 | 过滤器
{{ variable | filter_name(*args)}}如果没有任何参数传给过滤器,则可以把括号省略掉
{{variable | filter_name}}
6.1 链式调用
在Jinja2中,过滤器支持链式调用,示例如下:
{{'hello word' | reverse | upper}}
输出结果为:
DROW OLLEH
6.2 常见内建过滤器
capitalize
把变量值的首字母转成大写,其余字母转小写<p>{{ 'hello' | capitalize }}</p>
lower
把值转成小写<p>{{ 'HELLO' | lower }}</p>
upper
把值转成大写<p>{{ 'hello' | upper }}</p>
title
把值中的每个单词的首字母都转成大写<p>{{ 'hello' | title }}</p>
reverse
字符串反转<p>{{ 'olleh' | reverse }}</p>
format
格式化输出<p>{{ '%s is %d' | format('name',17) }}</p>
6.3 列表操作
- first
取第一个元素<p>{{ [1,2,3,4,5,6] | first }}</p>
- last
取最后一个元素<p>{{ [1,2,3,4,5,6] | last }}</p>
- length
获取列表长度<p>{{ [1,2,3,4,5,6] | length }}</p>
- sum
列表求和<p>{{ [1,2,3,4,5,6] | sum }}</p>
- sort
列表排序<p>{{ [6,2,3,1,5,4] | sort }}</p>
七、控制代码块
控制代码块主要包含两个:
if/else if/else / endif
for / endfor
7.1 if语句
Jinja2语法中的if语句跟Python中的if语句相似,后面的布尔值或者返回布尔值的表达式将决定代码中那个流程会被执行:
{% if item.id != 5 %}{% if loop.index == 1 %}<li style="background-color: deeppink">{{ item.value }}</li>{% endif %}{% endif %}
7.2 循环
- 在Jinja2中使用循环来迭代任何列表或者生成器函数
{% for post in posts %}<div><h1>{{ post.title }}</h1><p>{{ post.text | safe }}</p></div>
{% endfor %}
- 循环和if语句可以组合使用
{% for post in posts if post.text %}<div><h1>{{ post.title }}</h1><p>{{ post.text | safe }}</p></div>
{% endfor %}
八、特有变量和函数
可以在自己的模板中访问一些 Flask 默认内置的函数和对象
8.1 config
从模板中直接访问Flask当前的config对象
{{config.SQLALCHEMY_DATABASE_URI}}
sqlite:///database.db
8.2 request
Flask中代表当前请求的request对象
{{request.url}}
http://127.0.0.1
8.3 session
为Flask的session对象
{{session.new}}
True
8.4 g变量
在视图函数中设置g变量的name属性的值,然后在模板中直接可以取出
{{ g.name }}
8.5 url_for()
url_for会根据传入的路由器函数名,返回该路由对应的URL,在模板中始终使用url_for()就可以安全的修改路由绑定的URL,则不比担心模板中渲染出错的链接:
{{url_for('home')}}
/
如果定义的路由URL是带有参数的,则可以把它们作为关键字参数传入url_for(),Flask会把他们填充进最终生成的URL中:
{{ url_for('post', post_id=1)}}
/post/1
【python】Flask之模板引擎相关推荐
- Flask HTML模板引擎详解
模板引擎说明: 模板文件就是按照一定的规则书写的展示效果的HTML文件模板引擎就是负责按照指定规则进行替换的工具模板引擎选择jinja2. 一.渲染模板的方法 1.将渲染的模板进行返回 1 rende ...
- Flask Jinja2模板引擎
模板 在前面的示例中,视图函数的主要作用是生成请求的响应,这是最简单的请求.实际上,视图函数有两个作用:处理业务逻辑和返回响应内容.在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护 ...
- python flask html模板,python flask web开发实战 Jinja2模板
templates/index.html Hello World! templates/user.html Hello, {{ name }}! 渲染模板: from flask import Fla ...
- Python flask渲染模板注入
2018-TokyoWesterns-Web-shrine 参考链接: https://blog.csdn.net/Onlyone_1314/article/details/121875761 imp ...
- python 模板引擎 对比_Python Web开发模板引擎优缺点总结
做 Web 开发少不了要与模板引擎打交道.我陆续也接触了 Python 的不少模板引擎,感觉可以总结一下了. 一.首先按照我的熟悉程度列一下: pyTenjin:我在开发 Doodle 和 91 外教 ...
- python flask源码解析_用尽洪荒之力学习Flask源码
[TOC] 一直想做源码阅读这件事,总感觉难度太高时间太少,可望不可见.最近正好时间充裕,决定试试做一下,并记录一下学习心得. 首先说明一下,本文研究的Flask版本是0.12. 首先做个小示例,在p ...
- flask html 模板继承,Flask框架模板继承实现方法分析
Flask框架模板继承实现方法分析 本文实例讲述了Flask框架模板继承实现方法.分享给大家供大家参考,具体如下: 在模板中,可能会遇到以下情况: 多个模板具有完全相同的顶部和底部内容 多个模板中具有 ...
- python flask 快速搭建 WEB 实战
python flask 快速搭建 WEB 实战 tags: flask 文章目录 python flask 快速搭建 WEB 实战 1. app.py配置首页 2. views.py配置首页 3. ...
- Python Flask Web 第四课 —— 模板引擎Jinja2
1. 基本介绍 形式最为简单的 Jinja2 模板是一个包含响应文本的文件. templates/index.html <h1>Hello World!</h1> 既然是模板, ...
最新文章
- python归一化代码_python中的快速图像归一化
- 第四届泉水文化论坛协调会-商协社团:平台经济谋定水产业
- reactjs中收集表单数据:非受控组件和受控组件
- 面向对象思想封装狙击手狙击敌人
- android自验签名证书,没有以前的互联网连接,无法验证Android自签名证书
- 外媒:华为曾大量采购联发科5G智能手机芯片天玑
- OpenGL基础28:模型
- android 自定义 滑动删除,Android_Android ListView实现仿iPhone实现左滑删除按钮的简单实例,需要自定义ListView。这里就交Fl - phpStudy...
- pythonweb项目源码下载_最新Python WEB开发在线教育项目之谷粒教育 软件源码齐全...
- html能在hade中注释吗,A第1章 HTML超文本标记语言(1-20)OK.doc
- Microsoft Office Professional Plus 2010在安装中出错 解决办法 安装office2010出错
- QCC3005 芯片开发过程中碰到的一些问题
- 插件制作教程 php,HYBBS插件开发教程 (简单插件) 初识篇
- 给初学者:用VB写外挂 ———— 实战三:泰坦之旅V1.08 十项属性修改器——另一种无输入焦点时响应按键的方法
- iOS AddressBook
- java毕业设计校园闲置物品租售系统mybatis+源码+调试部署+系统+数据库+lw
- python携程怎么做数据同步_利用python yielding创建协程将异步编程同步化
- tiktok也会像Facebook一样封号吗?哪些行为会封号?
- Javaweb后端技术(下)02-Mybatis
- 操作系统春招面试复习之:文件管理