目录
一个好看的页面需要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) |
返回一个序列的第一个元素 |
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)