Flask之jinja2模板(一)

简介: 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。

c7d49a9e22d0b1dd0efc72803c973db4.png

关于模板


模板的使用


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)

返回一个序列的第一个元素

name∣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)

返回一个序列或者字典的长度。

示例:name∣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月前
|
Python
Flask 模板标签语言的使用
Flask 模板标签语言的使用
22 4
|
5月前
|
API 网络架构 开发者
Flask Web开发基础【路由和Jinja2模板引擎】
# Flask Web开发基础 Flask是轻量级Web框架,专注于核心功能:请求响应、模板渲染和URL路由。本文档介绍了使用Flask的基础知识,包括命令行和Python两种运行模式,以及如何修改入口文件、端口和地址。此外,还讨论了URL路由的概念和其在Flask中的实现,展示了动态路由和多URL绑定的例子。最后,提到了Jinja2模板引擎,解释了其基本语法,并通过电影列表案例展示了如何结合Flask使用模板。
70 1
|
1月前
|
自然语言处理 Python
六、Flask模板使用方法
六、Flask模板使用方法
13 0
|
3月前
|
前端开发 Python
使用 Flask 3 搭建问答平台(三):注册页面模板渲染
使用 Flask 3 搭建问答平台(三):注册页面模板渲染
|
5月前
|
前端开发 JavaScript Python
flask实战-模板实现公共导航
在Flask中实现模板继承,创建基础模板`base.html`,包含公共导航菜单。子模板`movie-extends.html`继承`base.html`,并定义主要内容。视图函数`movie_extends_view`渲染`movie-extends.html`,显示电影列表。通过`extra_css`和`extra_js`块添加页面特定的样式和脚本,实现在`movie-extends.html`中应用自定义CSS样式。运行应用,访问http://127.0.0.1:1027/movie-extends,页面显示定制的电影列表样式。
87 2
|
6月前
|
Python
Flask中的模板的使用
Flask中的模板的使用
41 0
|
6月前
|
存储 移动开发 前端开发
Flask狼书笔记 | 03_模板
3 模板 模板(template):包含固定内容和动态部分的可重用文件。Jinja2模板引擎可用于任何纯文本文件。 3.1 模板基本使用
59 0
|
6月前
|
开发框架 Python
Web 框架 Flask 快速入门(一)flask基础与模板
🌴 Flask基础和模板 1、web框架的作用 避免重复造轮子,app程序不必关心于服务器的沟通方式,而专注于核心的业务逻辑实现。 稳定,可扩展性强
107 0
|
JavaScript 前端开发 知识图谱
flask-模板用法
flask-模板用法
57 0
|
Python
【jinja2】flask和jinja2配合使用
【jinja2】flask和jinja2配合使用
137 0