目录
一个好看的页面需要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)
救命啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊最后这个程序出现的错误,我找了半个小时没找到,我以及要崩溃了。啊啊啊操不找了,以后看的时候再说了。