Flask之jinja2模板(一)

目录

关于模板

模板的使用

模板的传参

在模板中使用url_for函数

关于过滤器

过滤器的基本使用

jinja模板中自带的过滤器

 defalut过滤器

转义字符过滤器

 其他过滤器


一个好看的页面需要html、css和js,那么按照之前的学习就是这样写:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return '<h1>hello</h1><p style="color:red">这个是内容!</p>'

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

可以看到这样的写法也可以达到想要的效果,但是return里面很臃肿,而且不能自动识别显示效果和错误代码。

解决方案:

使用MVT设计方案:

M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。

V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答。

T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html。

关于模板

模板的使用

1.先通过render_template导入:

from flask import Flask,render_template

2.在同级目录下创建一个templates文件夹,在templates文件夹里进行创建需要的文件。

3.设置模板查找路径:

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

模板的传参

参数传递的规范:key , value 的形式

1.可以直接在render_template里面直接进行传参,。

2.多个参数可以放在一个字典里进行编写,用**进行解剖。


from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index20.html',info='Flask模板',arg = 'python中的Flask')

@app.route('/home')
def home():
    #传递多组数据的时候可以通过这种方式编写
    context = {
        'uname':'xiaoli',
        'age':20,
        'body':'fine'
    }
    return render_template('index20.html',**context)


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

 在对应路径文件(这里为index20.html)里,进行参数的接收,其格式为{{ xxx }}或者{{ xxxx.xxx }}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>模板的传参</title>
</head>
<body>
    <h1>模板的传参</h1>
    <p>这个是关于 {{ info }} 的内容</p>
    <p>这个是关于 {{ arg }} 的内容</p>
    <p>我的名字是:{{ uname }},年龄为:{{ age }},我的身体:{{ body }} </p>
    
</body>
</html>

在模板中使用url_for函数

回顾url_for 的使用方法以及意义:

python学习之Flask框架(二)_python小白一的博客-CSDN博客

简单的使用:


from flask import Flask,render_template

app = Flask(__name__)

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


@app.route('/home/')
def home():
    return 'hello'

@app.route('/home1/<int:id>')
def home1(id):
    return 'hello'


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

 注意:在模板中url_for 的使用遵循{{ url_for(func_name,<参数...>)}}语法结构 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>模板中url_for的使用</title>
</head>
<body>

    <h1>url_for 函数</h1>
    <hr>
    {{ url_for('index') }}
    <br>
    {{ url_for('home') }}
    <br>
    {{ url_for('home1',id=1101) }}
    <br>
    {{ url_for('home1',id=1101,addr='bj') }}
    <br>
    <a href="/home/">访问home的内容</a>
    <br>
    <a href="{{ url_for('home') }}">访问home的内容</a>
    
    
</body>
</html>

如上所示:

1.url_for函数中,无论是 路径参数 还是 查询式参数 都可以直接传递。

2.url_for函数在模板中最常见的使用是在a标签里边,直接返回路由地址生成一个访问路径。

关于过滤器

过滤器的基本使用

在模版中,过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功能,再返回相应的值,之后再将结果渲染到页面中。

from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index22.html',param=10.5)

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

 注意: 过滤器语法是{{data|filter}}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过滤器的使用</title>
</head>
<body>
    <h1>过滤器的使用</h1>
    <br>
    过滤前的数据:{{ param }}
    <br>
    过滤后的数据:{{ param | int }}
</body>
</html>

上图中传递的数据param=10.5经过{{ param | int }} 处理后显示为10。

jinja模板中自带的过滤器

Jinja2中内置过滤器:Template Designer Documentation — Jinja Documentation (3.0.x)

过滤器名解释举例
abs(value)返回一个数值的绝对值-1|abs
int(value)将值转换为int类型
float(value)将值转换为float类型
string(value)将变量转换成字符串
default(value,default_value,boolean=false)如果当前变量没有值,则会使用参数中的值来代替。如果想使用python的形式判断是否为false,则可以传递boolean=true。也可以使用or来替换name|default('xiaotuo')
safe(value)如果开启了全局转义,那么safe过滤器会将变量关掉转义content_html|safe
escape(value)或e转义字符,会将<、>等符号转义成HTML中的符号content|escape或content|e。
first(value)返回一个序列的第一个元素names|first
format(value,*arags,**kwargs)格式化字符串{{ "%s"-"%s"|format('Hello?',"Foo!") }} 输出 Hello?-Fool!
last(value)返回一个序列的最后一个元素。示例:names|last
length(value)返回一个序列或者字典的长度。示例:names|length
join(value,d='+')将一个序列用d这个参数的值拼接成字符串
lower(value)将字符串转换为小写
upper(value)将字符串转换为小写
replace(value,old,new)替换将old替换为new的字符串
truncate(value,length=255,killwords=False)截取length长度的字符串
striptags(value)删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格
trim截取字符串前面和后面的空白字符
wordcount(s)计算一个长字符串中单词的个数

 defalut过滤器

如果当前变量没有值,则会使用参数中的值来代替。如果想使用python的形式判断是否为false,则可以传递boolean=true。也可以使用or来替换。

from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def index():
    # return render_template('index23.html',nick_name='小林')
    # return render_template('index23.html')
    
    #传递一下数据时需要加上boolean=True参数
    # return render_template('index23.html',nick_name='')
    # return render_template('index23.html',nick_name=[])
    return render_template('index23.html',nick_name=None)

if __name__ == '__main__':
    app.run(debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>default过滤器的使用</title>
</head>
<body>
    <h1>default过滤器的使用</h1>
    
    过滤前的昵称数据是:{{ nick_name }}
    <br>
    过滤后的昵称数据是:{{ nick_name | default('用户1',boolean=True) }}    
    <br>
    过滤后的昵称数据是:{{ nick_name or '用户2') }}    

</body>
</html>

转义字符过滤器

inja2模板 默认全局开启了自动转义功能

  • safe过滤器:可以关闭一个字符串的自动转义

  • escape过滤器:对某一个字符串进行转义

  • autoescape 标签,可以对他包含的代码块关闭或开启自动转义

    • {% autoescape true/false %} 代码块 {% endautoescape %}

 

from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def index():
    info = "<script>alert('hello!!')</script>"
    return render_template('index24.html',info=info)

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

 

<body>
    <h1>转义字符过滤器</h1>
    <!--模板中默认 做了转义字符的效果-->
    <!-- 转义前的数据是:{{ info | safe}} -->

    {% autoescape false %}
        <!--false代表不再转义特殊字符 true代表转义特殊字符-->
        {{ info }}
    {% endautoescape %}
    
    
</body>

 其他过滤器

常见的几个过滤器:

replace(value,old,new)替换将old替换为new的字符串
float(value)将值转换为float类型
format(value,*arags,**kwargs)格式化字符串
length(value)返回一个序列或者字典的长度。示例:names|length
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>其他过滤器</title>
</head>
<body>
    <h1>其他过滤器</h1>
    绝对值:{{ -6 | abs }}
    <br>
    小数:{{ 6 | float }}
    <br>
    字符串:{{ 6 | string }}
    <br>
    格式化:{{ '%s--%s' | format('我','你')}}
    <br>
    长度:{{ 'sdwabcawdjav' | length }}
    <br>
    统计:{{ 'sdwa sdaw  iwabd dkwa sadgw dawbd' | wordcount }}
    <br>
    替换:{{ '你好' | replace('你好','hello')}}
    
</body>
</html>

自定义内容过滤器

        当系统提供的过滤器不符合需求时,需要自定义过滤器。

        需要使用到一个装饰器:@app.template_filter('过滤器名称')

例:(自定义替换过滤器) 

from distutils.log import info
from flask import Flask,render_template

app = Flask(__name__)

@app.template_filter('cut')
def cut(value):
    value = value.replace('我不知道','我知道')
    return value

@app.route('/')
def index():
    info = '=====这些我不知道====='
    return render_template('index26.html',info=info)

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

自定义时间过滤器

发布的时间与现在的时间差

from flask import Flask,render_template
from datetime import  datetime

app = Flask(__name__)

# 年 月 日 时 分 秒
#数据库中存放的数据是 2030/01/01 00:00:00
#现在的时间是        2030/01/01 00:10:00
@app.template_filter('hander_time')
def hander_time(time):
    '''
        time距离现在的时间间隔
        1. 如果时间间隔小于1分钟以内,那么就显示“刚刚”
        2. 如果是大于1分钟小于1小时,那么就显示“xx分钟前”
        3. 如果是大于1小时小于24小时,那么就显示“xx小时前”
        4. 如果是大于24小时小于30天以内,那么就显示“xx天前”
        5. 否则就是显示   很久以前
    '''
    #获取当前时间
    now = datetime.now()
    #将相差的时间转为秒
    temp_stamp = (now-time).total_seconds()
    if temp_stamp < 60:
        return '一分钟以前'
    elif temp_stamp >=60 and temp_stamp <60*60:
        return '一小时之前'
    elif temp_stamp >60*60 and temp_stamp <60*60*24:
        hours = int(temp_stamp/(60*60))
        return f'{hours}小时前'
    elif temp_stamp >=60*60*24 and temp_stamp <60*60*24*30:
        day = int(temp_stamp/(60*60*24*30))
        return f'{day}天前'
    else:
        return '很久以前'


@app.route('/')
def index():
    tmp_time = datetime(2022, 10, 24,10,10,10)
    return render_template('index27.html',tmp_time= tmp_time)

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

救命啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊最后这个程序出现的错误,我找了半个小时没找到,我以及要崩溃了。啊啊啊操不找了,以后看的时候再说了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我还可以熬_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值