《Flask_Web开发》读书笔记-第三章

第三章 模板

序:第二章中了解到的视图函数的作用是,产生客户端请求的响应。

       当用户在网站中注册了一个新账户:用户在表单中输入电子邮件和密码,然后点击提交按钮。服务器接收到包含用户输入数据的请求,然后Flask把请求分发到处理注册请求的视图函数,这时视图函数需要去访问数据库添加新用户,之后生成响应回送给浏览器。这两个过程分别称为业务逻辑表现逻辑。当业务逻辑和表现逻辑混在一起时,会导致数据代码难以维护,这时使用模板就是一个更好地分开业务逻辑与表现逻辑的方法了,我们将表现逻辑转移到模板中能够提升程序的可维护性。

  • 模板:一个包含响应文本的文件,其中包含用占位变量表示的动态部分,具体值在上下文中才知道。
  • 渲染:使用真实值替换变量,再返回最终得到响应字符串,这一过程被称为模板的渲染。

3.1 Jinja2模板引擎

      下例一个最简单的Jinja2模板就是一个包含响应文本的文件(命名为index.html)。

<h1>Hello World!</h1>

3.1.1 渲染模板

        ⭐默认情况下,Flask会在程序文件夹中的子文件夹templates中寻找模板

渲染实例:

from flask import Flask,render_template

@app.route('/ex1')
def index1():
    return render_template('index.html')

@app.route('/ex2/<name>')
def index2(name):
    return render_template('user.html',name=name)

if __name__ == '__main__':
    app.run(debug=True)

其中index.html文件为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Hello templates!</h1>
</body>
</html>

  

user.html文件为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Hello,{{ name }}!</h1>
</body>
</html>

  

        可以看到,Flask提供的render_templates函数把Jinjia2模板引擎集中到了程序中,render_templates函数的第一个参数是模板的文件名,随后的参数都是键值对,表示模板中的变量与对应的真实值。也就是说,在第二个路由中,函数index2(name)中,name=name这个键值对分别为,等号左边的name代表模板user.html中的name占位符,等号右边的name代表的是当前函数中传入的name真实值。使用pycharm开发时,也会从软件的提醒下发现两者的不同。

3.1.2变量

        文件user.html中使用的{{ name }}结构表示一个变量,这是一种特殊的占位符,告诉模板引擎这个位置的值从渲染模板时的数据中获取。

        Jinja2能识别所有类型的变量,甚至是一些复杂的类型,如列表,字典和对象。

{#  #}  注释代码块
{{  }}  变量代码块
{%  %}  控制代码块

控制代码块可以实现for循环,if语句 

示例如下:

<p>A value from a dictionary:{{ mydict['key'] }}</p>
<p>A value from a list:{{ mylist[3]}}</p>
<p>A value from a list,with a variable index:{{ mylist[myintvar] }}</p>
<p>A value from an object's methods:{{ myobj.somemethod() }}</p>

另外,可以使用过滤器修改变量,过滤器的使用如下:

{{ name|capitalize }}

变量名在左边,过滤器在竖线右边,过滤后,会使name的值变成首字母大写的形式。

                              ?常用Jinja2变量过滤器?

过滤器名说明
safe

渲染值时不转义

capitalize把值的首字母转换成大写,其他字母小写
lower把值转换成小写形式
upper把值转换成大写形式
title把值中的每个单词的首字母都转换成大写
trim把值的首尾空格去掉
striptags渲染之前把值中所有的HTML标签都剪掉

?过滤器的链式调用:

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

3.1.3 控制结构

        Jinja2提供了多种控制结构,用来改变模板的流程

       ⭐条件控制语句

{% if user %}
    hello,{{ user }}!
{% else %}
    hello,Stranger!
{% endif %}

       ⭐for循环实现在模板中渲染一组元素

       ?在写for循环控制语句时,可以先写for,然后按住tab键将代码块进行自动补全

<ul>
    {% for comment in comments %}
        <li>{{ comment }}</li>
    {% endfor %}
</ul>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值