Flask_模板
定义:包含响应文本文件,使用占位符标识动态,可以从使用的数据中获取
渲染的定义:使用真实数据替换变量,并返回最终的字符串
Flask:使用的是jinja2模板引擎进行渲染
好处:
视图函数负责:业务逻辑和数据处理
模板负责:接收视图函数结果进行展示
代码清晰,低耦合
样式:{{ 变量代码块 }} {% 控制代码块 %}
注释:{{# 注释结果不会被渲染 #}}
传递值至模板:
创建:templates 文件夹 【设置为指定文件夹,修改html模板语言为jinja2】
视图中导入:rander_template
视图函数返回值:return rander_template("模板文件名.html",变量名,x2...)
变量可以是字符串,列表,字典
该跳转后,浏览器显示的还是访问路径不是模板路径
过滤器:
概述:修改变量显示以及格式化运算等
应用:变量名 | 过滤器 【{{variable | filter_name(*args)}}】
支持链式调用:{{ 值 | 过滤器1 | 过滤器2 }}按照顺序从左至右执行过滤器
内置过滤器:
safe:禁用转义,因为标签默认转换[lt;h1gt = <h1>]
capitalize:变量首字母大写,其余小写
lower:转换为小写
upper:转换为大写
title:值中每个单词的首字母转大写 ??
reverse:字符串反转
format:格式化输出 【<p>{{ '%s is %d' | format('name',17) }}</p>】
striptags:渲染前清除所有HTML标签
truncate:字符串截断
列表操作:
first:取第一个元素
last:取最后一个元素
length:列表长度
sum:列表求和
sort:列表排序
语句块过滤:
{% filter upper%}
#文字块#
{% endfilter %}
自定义过滤器:
注意:自定义的过滤器名称如果和内置的过滤器重名,覆盖内置过滤器
创建方式:
1.调用实例的 add_template_filter 方法,参数一(规则函数的函数名),参数二(自定义过滤器名称)
2.装饰器实现,参数是自定义的过滤器名称
应用:{{ 值 | 过滤器 }}
控制代码块
Jinja2的语法稍有不同,但本质一致,返回结果为布尔值
{%if else if else endif(结束) %}
{% for endfor(结束) %}
两者可以一起使用,在for循环中可以用到:
loop.index 当前循环次数,从1开始
loop.index() 当前循环次数,从0开始
loop.revindex 当前循环结束需要迭代的次数,从1开始
loop.revindex() 当前循环结束需要迭代的次数,从1开始
loop.first 第一次迭代,为True
loop.last 最后一次迭代,为True
loop.length 序列中的项目数
loop.cycle 在一串序列间期取值的辅助函数
模板继承
场景:存在相同的htnl代码块,以及部分相同的顶部和底部内容
作用:重用模板的公共内容
{% block xx %} {% endblock %}
子模板使{% extends 'xxxx'%} 声明父模板继承
重写:与父模板的block 名称一致
注意:
不支持多继承
子模板使用extends时,尽量在模板第一行
不能再一个模板文件定义多个相同名字的block标签
使用多个block标签时,建议给结束标签取名使用
特有变量和函数
Flask内置的函数和变量
作用:使用内置对象,无需动态传递值,页面直接使用
config:偶去当前config对象
request:代表当前请求的request对象
session:为Flask的session对象
g:全局临时变量
url_for:根据传入的路由函数名,返回路由对应的url
CSRF
概述:跨站请求伪造,攻击者盗用用户身份发送恶意请求,盗取账号以及私密资料造成隐私泄露和财产安全问题
攻击流程:
防止步骤:
1.客户端发送请求时,在响应中添加csrf_token值
2.在form表单中添加隐藏字段,值是csrf_token
3.用户提交时,带上连个值向后台发送请求
4.后端接收后:
a.从cookie中取出csrf_token
b.从表单中取出隐藏的 csrf_token 的值
c.进行对比
5.验证条件,值一致则正常请求,没有取到则不执行下一步
Flask中解决CSRF:
1.设置程序的secret_key:用于加密生成 csrf_token 的值
app.secret_key = "随机字符串"
2.导入 flask_wtf.csrf 的CSRFProtect类,初始化并关联app
from flask.ext.wtf import CSRFProtect
CSRFProtect(app)
3.如果模板中有表单,在表单中添加
{{ form.csrf_token }}
没有表单则自己设置
<form method='post' action="/">
<input type"hidden" name="csrf_token" value="{{ csrf_token() }}">
</form>