赞
踩
目录
一个好看的页面需要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 的使用方法以及意义:
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。
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) | 计算一个长字符串中单词的个数 |
如果当前变量没有值,则会使用参数中的值来代替。如果想使用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)
救命啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊最后这个程序出现的错误,我找了半个小时没找到,我以及要崩溃了。啊啊啊操不找了,以后看的时候再说了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。