当前位置:   article > 正文

Flask之jinja2模板(一)_jinja2 urlfor

jinja2 urlfor

目录

关于模板

模板的使用

模板的传参

在模板中使用url_for函数

关于过滤器

过滤器的基本使用

jinja模板中自带的过滤器

 defalut过滤器

转义字符过滤器

 其他过滤器


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

  1. from flask import Flask
  2. app = Flask(__name__)
  3. @app.route('/')
  4. def index():
  5. return '<h1>hello</h1><p style="color:red">这个是内容!</p>'
  6. if __name__ == '__main__':
  7. 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.设置模板查找路径:

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

模板的传参

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

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

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

  1. from flask import Flask,render_template
  2. app = Flask(__name__)
  3. @app.route('/')
  4. def index():
  5. return render_template('index20.html',info='Flask模板',arg = 'python中的Flask')
  6. @app.route('/home')
  7. def home():
  8. #传递多组数据的时候可以通过这种方式编写
  9. context = {
  10. 'uname':'xiaoli',
  11. 'age':20,
  12. 'body':'fine'
  13. }
  14. return render_template('index20.html',**context)
  15. if __name__ == '__main__':
  16. app.run(debug=True)

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

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

在模板中使用url_for函数

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

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

简单的使用:

  1. from flask import Flask,render_template
  2. app = Flask(__name__)
  3. @app.route('/')
  4. def index():
  5. return render_template('index21.html')
  6. @app.route('/home/')
  7. def home():
  8. return 'hello'
  9. @app.route('/home1/<int:id>')
  10. def home1(id):
  11. return 'hello'
  12. if __name__ == '__main__':
  13. app.run(debug=True)

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

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>模板中url_for的使用</title>
  8. </head>
  9. <body>
  10. <h1>url_for 函数</h1>
  11. <hr>
  12. {{ url_for('index') }}
  13. <br>
  14. {{ url_for('home') }}
  15. <br>
  16. {{ url_for('home1',id=1101) }}
  17. <br>
  18. {{ url_for('home1',id=1101,addr='bj') }}
  19. <br>
  20. <a href="/home/">访问home的内容</a>
  21. <br>
  22. <a href="{{ url_for('home') }}">访问home的内容</a>
  23. </body>
  24. </html>

如上所示:

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

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

关于过滤器

过滤器的基本使用

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

  1. from flask import Flask,render_template
  2. app = Flask(__name__)
  3. @app.route('/')
  4. def index():
  5. return render_template('index22.html',param=10.5)
  6. if __name__ == '__main__':
  7. app.run(debug=True)

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

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>过滤器的使用</title>
  8. </head>
  9. <body>
  10. <h1>过滤器的使用</h1>
  11. <br>
  12. 过滤前的数据:{{ param }}
  13. <br>
  14. 过滤后的数据:{{ param | int }}
  15. </body>
  16. </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来替换。

  1. from flask import Flask,render_template
  2. app = Flask(__name__)
  3. @app.route('/')
  4. def index():
  5. # return render_template('index23.html',nick_name='小林')
  6. # return render_template('index23.html')
  7. #传递一下数据时需要加上boolean=True参数
  8. # return render_template('index23.html',nick_name='')
  9. # return render_template('index23.html',nick_name=[])
  10. return render_template('index23.html',nick_name=None)
  11. if __name__ == '__main__':
  12. app.run(debug=True)
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>default过滤器的使用</title>
  8. </head>
  9. <body>
  10. <h1>default过滤器的使用</h1>
  11. 过滤前的昵称数据是:{{ nick_name }}
  12. <br>
  13. 过滤后的昵称数据是:{{ nick_name | default('用户1',boolean=True) }}
  14. <br>
  15. 过滤后的昵称数据是:{{ nick_name or '用户2') }}
  16. </body>
  17. </html>

转义字符过滤器

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

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

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

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

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

 

  1. from flask import Flask,render_template
  2. app = Flask(__name__)
  3. @app.route('/')
  4. def index():
  5. info = "<script>alert('hello!!')</script>"
  6. return render_template('index24.html',info=info)
  7. if __name__ == '__main__':
  8. app.run(debug=True)

 

  1. <body>
  2. <h1>转义字符过滤器</h1>
  3. <!--模板中默认 做了转义字符的效果-->
  4. <!-- 转义前的数据是:{{ info | safe}} -->
  5. {% autoescape false %}
  6. <!--false代表不再转义特殊字符 true代表转义特殊字符-->
  7. {{ info }}
  8. {% endautoescape %}
  9. </body>

 其他过滤器

常见的几个过滤器:

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

自定义内容过滤器

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

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

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

  1. from distutils.log import info
  2. from flask import Flask,render_template
  3. app = Flask(__name__)
  4. @app.template_filter('cut')
  5. def cut(value):
  6. value = value.replace('我不知道','我知道')
  7. return value
  8. @app.route('/')
  9. def index():
  10. info = '=====这些我不知道====='
  11. return render_template('index26.html',info=info)
  12. if __name__ == '__main__':
  13. app.run(debug=True)

自定义时间过滤器

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

  1. from flask import Flask,render_template
  2. from datetime import datetime
  3. app = Flask(__name__)
  4. # 年 月 日 时 分 秒
  5. #数据库中存放的数据是 2030/01/01 00:00:00
  6. #现在的时间是 2030/01/01 00:10:00
  7. @app.template_filter('hander_time')
  8. def hander_time(time):
  9. '''
  10. time距离现在的时间间隔
  11. 1. 如果时间间隔小于1分钟以内,那么就显示“刚刚”
  12. 2. 如果是大于1分钟小于1小时,那么就显示“xx分钟前”
  13. 3. 如果是大于1小时小于24小时,那么就显示“xx小时前”
  14. 4. 如果是大于24小时小于30天以内,那么就显示“xx天前”
  15. 5. 否则就是显示 很久以前
  16. '''
  17. #获取当前时间
  18. now = datetime.now()
  19. #将相差的时间转为秒
  20. temp_stamp = (now-time).total_seconds()
  21. if temp_stamp < 60:
  22. return '一分钟以前'
  23. elif temp_stamp >=60 and temp_stamp <60*60:
  24. return '一小时之前'
  25. elif temp_stamp >60*60 and temp_stamp <60*60*24:
  26. hours = int(temp_stamp/(60*60))
  27. return f'{hours}小时前'
  28. elif temp_stamp >=60*60*24 and temp_stamp <60*60*24*30:
  29. day = int(temp_stamp/(60*60*24*30))
  30. return f'{day}天前'
  31. else:
  32. return '很久以前'
  33. @app.route('/')
  34. def index():
  35. tmp_time = datetime(2022, 10, 24,10,10,10)
  36. return render_template('index27.html',tmp_time= tmp_time)
  37. if __name__ == '__main__':
  38. app.run(debug=True)

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/191341
推荐阅读
相关标签
  

闽ICP备14008679号