模板引擎
说明:模板文件就是按照一定的规则书写的展示效果的HTML文件 模板引擎就是负责按照指定规则进行替换的工具
模板引擎选择jinja2
一、渲染模板的方法
1、将渲染的模板进行返回
render_template()
2、渲染字符串返回
render_templates_string()
实例
@app.route('/') def index(): #将模板内容响应给用户 return render_template('index.html') #渲染一内容响应给用户 return render_template_string('<h1 style="color:green;font-size:18px;">原谅色</h1>')
二、模板的语法
模板中只存在俩种语法
1、变量
{{ var }}
#像模板文件中传参 return render_template('index.html',title='首恶') {{ title }}
2、标签
{% 标签名 %}
注意:
在模板中使用字典中的键 需要像使用对象得方式来调用
{{data.key}}
如果在模板中给定的变量不存在 则插入的是空字符串 不会报错
三、过滤器
过滤器使用管道符 | 来使用的
1、{{ var|abs }} 返回一个数值的绝对值
2、default 设置默认值
只有当给定的变量不存在时 则执行默认值
当设置default的boolean的时候 会执行默认值
<li>{{ data.bool|default('我是默认值',boolean=True) }}</li>
3、first: 取出变量中的第一个字符
4、last: 取出变量中的最后一个字符
5、format: 字符的格式化
<li>{{ '我叫%s 我今年%d岁了 我的存款为 %.2f'|format('罗铁汉',38,23) }}</li>
6、length: 返回变量值的长度
7、join: 拼接成字符串
<li>{{ [1,2,3,4]|join('') }}</li> <li>{{ [1,2,3,4]|join('x') }}</li>
8、safe: 不转义标签 原样显示
9、lower 转为小写
10、upper 转为大写
11、replace 替换
<li>{{ data.string|replace('a','x') }}</li>
12、striptages 去除HTML标签
{{ data.html|striptags }}
四、标签
语法格式 :{% 标签名 %}
(1) if
实例
{% if data.bool %} <li>{{ data.bool }}值为真</li> {% elif True %} <li>{{ True }}职位真</li> {% else %} <li>{{ data.bool }}值为假</li> {% endif %}
(2) for 循环
实例
{% for i in data.xxxx %} {# 错误的迭代方法TypeError: 'bool' object is not iterable #} {# {% for i in data.bool %}#} <li>{{ i }}</li> {% else %} <li>当迭代的变量不存在时 则执行else</li> {% endfor %}
注意:
break continue 不能够在这里使用
迭代字典
{% for k,v in data.items() %} <li>{{ k }}=>{{ v }}</li> {% endfor %}
获取当前迭代的状态
变量
描述
loop.index
获取当前迭代的索引 从1开始
loop.index0
获取当前迭代的索引 从0开始
loop.first
是否为第一次迭代
loop.last
是否为最后一次迭代
loop.length
迭代的长度
六、注释
{# 多行注释 #}
七、文件包含 include
相当于把一个文件 拷贝到当前的你的包含的位置
实例
{% include 'common/header.html' %} <div>我是中间的内容</div> {% include 'common/footer.html' %}
注意:
1、包含的公共的文件中 只存放 公共的代码 除此以外什么都不要存在
2、导入的时候 如果文件和在同一级别 直接导入就可以 如果包含在某个目录中 需要写出路径
{% include 'common/header.html' %} {% include 'test.html' %}
八、宏 macro
概念: 类似python中的函数
实例
在macro.html中
{% macro input(name,type='text',value='') %} <input type="{{ type }}" name="{{ name }}" value="{{ value }}"> {% endmacro %}
宏的调用
{{ input('text','username','') }} {{ input() }} {{ input(type='password',name='userpass') }}
宏的导入
(1) import
{% import 'test.html' as test %} {% import 'common/test.html' as test %} <p>用户名: {{ test.input(type='password',name='userpass') }}</p>
(2) form import
{% from 'test.html' import input %} {% from 'common/test.html' import input %} <p>用户名: {{ input(type='password',name='userpass') }}</p>
注意:
- 宏的调用只能在定义的下方去调用 否则未定义
- 宏如果存在形参 且没有默认值 则可以调用(没意义)
- 形参的默认值 需要遵循默认值规则 有默认值的参数 放右侧
- 可以正常使用 关键字参数
九、继承 extends
语法:
- {% extends %} 继承某个模板
- {% block %} 挖坑和填坑
- {{ super() }} 调用被替换掉的代码
base.html
<!DOCTYPE html> <html lang="en"> <head> {% block header %} <meta charset="UTF-8"> {% block meta %} {% endblock %} <title>{% block title%}首页{% endblock %}</title> <style> {% block style %} p{color:red;} {% endblock %} </style> {% block link %} {% endblock %} {% block script %} {% endblock %} {% endblock %} </head> <body> <header>头部</header> {% block con %} 我是中间的内容部分 {% endblock %} <footer>尾部</footer> </body> </html>
index.html继承 base.html
{% extends 'common/base.html' %} {% block title %} 我的首页 {% endblock %} {% block style %} {{ super() }} p{color:green;} {% endblock %} {% block con %} <p>我是首页的内容</p> 我是首页的内容 {% endblock %}
注意:
如果当替换某个样式的时候 所有原来的样式 都消失了 去查看是否使用了super()
十、flask-bootstrap
安装
pip install flask-bootstrap sudo pip3 install flask-bootstrap
使用
继承 bootstrap/base.html 基础模板 改造成适用于自己网站的base.html基础模板
自己的base.html
{% extends 'bootstrap/base.html' %} {% block navbar %} <nav class="navbar navbar-inverse" style="border-radius: 0px;"> <div class="container-fluid"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><span class="glyphicon glyphicon-signal" aria-hidden="true"></span></a> </div> <!-- Collect the nav links, forms, and other content for toggling --> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav"> <li class="active"><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >首页 <span class="sr-only">(current)</span></a></li> <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >发帖子</a></li> </ul> <ul class="nav navbar-nav navbar-right"> <form class="navbar-form navbar-left"> <div class="form-group"> <input type="text" class="form-control" placeholder="Search"> </div> <button type="submit" class="btn btn-default">Submit</button> </form> <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >注册</a></li> <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >登录</a></li> <li class="dropdown"> <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">个人中心 <span class="caret"></span></a> <ul class="dropdown-menu"> <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >个人信息</a></li> <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >修改头像</a></li> <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >修改密码</a></li> <li role="separator" class="divider"></li> <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >Separated link</a></li> <li role="separator" class="divider"></li> <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >退出登录</a></li> </ul> </li> </ul> </div><!-- /.navbar-collapse --> </div><!-- /.container-fluid --> </nav> {% endblock %} {% block content %} <div class="container"> {% block pagecontent %} 网页的中间内容部分写在当前的位置 {% endblock %} </div> {% endblock %}
使用 index.html
{% extends 'common/base.html' %} {% block title %} 首页 {% endblock %}
十一、错误页面的定制
manage.py
@app.errorhandler(404) def page_not_found(e): return render_template('common/error.html',error=e,code=404) @app.errorhandler(500) def server_error(e): return render_template('common/error.html',error=e,code=500) error.html {% extends 'common/base.html' %} {% block title %} {{ code }}错误 {% endblock %} {% block pagecontent %} <div class="alert alert-danger" role="alert">{{ error }}</div> {% endblock %}
十二、视图传递多个参数
(1) 原始传参
@app.route('/') def index(): return render_template('index.html',arg1=1,arg2=2...)
(2) 使用字典
@app.route('/') def index(): return render_template('index.html',arg={arg1:1,arg2:2...}) kwarg={arg1:1,arg2:2...} return render_template('index.html',``)
(3) 使用全局变量g
@app.route('/') def index(): g.name = '张三' g.age = 18 return render_template('index.html')
模板中
<ol> <li>{{ g.name }}</li> <li>{{ g.age }}</li> </ol>
(4) 使用 **locals()
@app.route('/') def index(): name = '张三' age = 18 print(locals()) return render_template('index.html',**locals())
模板中
<li>{{ name }}</li> <li>{{ age }}</li>
十三、url_for 构造绝对的链接地址
@app.route('/test/') def test(): print(url_for('index',_external=True)) return 'test'
十四、加载静态资源
静态资源:图片,css,js,视频,音频,,
实例
<img src="/UploadFiles/2021-04-08/17.jpg') }}">以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
flask,模板引擎
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]