pythonFlask之模板引擎

Posted sysu_lluozh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pythonFlask之模板引擎相关的知识,希望对你有一定的参考价值。

一、模板介绍

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 = 10
    my_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_template

app = Flask(__name__)


@app.route('/')
def index():
    my_int = 18
    my_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

以上是关于pythonFlask之模板引擎的主要内容,如果未能解决你的问题,请参考以下文章

pythonFlask之模板引擎

pythonFlask之session使用

pythonFlask之路由

Go Web 编程之 模板

pythonFlask之获取请求参数

重学SpringBoot系列之整合静态资源与模板引擎