I、过滤器
Flask所使用的Jinja2模板引擎由于也借鉴了Django模板的工作模式,因此也可以使用过滤器
1、内置过滤器
常见的Flask自带的过滤器有大致如下两类
①字符串操作
过滤器名称 | 功能 | 语法 |
---|---|---|
safe | 禁用转义 | <p>{{ '<em>hello</em>' | safe }}</p> |
capitalize | 把变量值的首字母转成大写,其余字母转小写 | <p>{{ 'hello' | capitalize }}</p> |
lower | 把值转成小写 | <p>{{ 'HELLO' | lower }}</p> |
upper | 把值转成大写 | <p>{{ 'hello' | upper }}</p> |
title | 把值中的每个单词的首字母都转成大写 | <p>{{ 'hello' | title }}</p> |
reverse | 字符串反转 | <p>{{ 'olleh'| reverse }}</p> |
format | 格式化输出 | <p>{{ '%s is %d'| format('name',17) }}</p> |
striptags | 渲染之前把值中所有的HTML标签都删掉 | <p>{{ '<em>hello</em>'| striptags }} |
default | 用管道的形式,如果avatar(后端传过来的变量)的值不存在,则用default的值 | <p>{{avatar|default('xxx')}</p> |
truncate | 字符串截断 | <p>{{ 'hello every one' | truncate(9)}}</p> |
trim | 去除字符串前后的空白字符 | <p>{{ ' hello ' | trim }}</p> |
②列表操作
过滤器名称 | 功能 | 语法 |
---|---|---|
first | 取第一个元素 | <p>{{ [1,2,3,4,5,6] | first }}</p> |
last | 取最后一个元素 | <p>{{ [1,2,3,4,5,6] | last }}</p> |
length | 获取列表长度 | <p>{{ [1,2,3,4,5,6] | length }}</p> |
sum | 列表求和 | <p>{{ [1,2,3,4,5,6] | sum }}</p> |
sort | 列表排序 | <p>{{ [6,2,3,1,5,4] | sort }}</p> |
join | 列表串合并 | <p>{{ [1,2,3,4,5,6] | join('|') }}</p> |
upper | 列表元素全部大写 | <p>{{ ['tom','bob','ada'] | upper }}</p> |
lower | 列表元素全部小写 | <p>{{ ['tom','bob','ada'] | lower }}</p> |
③数值操作
过滤器名称 | 功能 | 语法 |
---|---|---|
round | 四舍五入取整,小数返回float | <p>{{ 12.8888 | round }}</p> |
floor | 向下截取到小数点后n位,返回12.88 | <p>{{ 12.8888 | round(n, 'floor') }}</p> |
abs | 取绝对值 | <p>{{ -12 | abs }}</p> |
2、自定义过滤器
和Django类似,我们自定义过滤器依旧可以采用装饰器的方式进行定义,此处应用的装饰器为
@app.template_filter()
,可以给过滤器器一个名字,如果没有,默认就是函数的名字。
@app.template_filter('listreverse')
def do_listreverse(li):
# 通过原列表创建一个新列表
temp_li = list(li)
# 将新列表进行返转
temp_li.reverse()
return temp_li
也可以通过app内注册的方式实现它,利用app.add_template_filter(注册函数名,'过滤器名称')
如果没有给过滤器名称,则过滤器默认同样为函数名。
def do_listreverse(li):
# 通过原列表创建一个新列表
temp_li = list(li)
# 将新列表进行返转
temp_li.reverse()
return temp_li
app.add_template_filter(do_listreverse,'lireverse')
模板调用,启动服务,观察结果
<p>{{ [7,2,4,3,5,1,6]|listreverse }}</p>
II、初识WTF表单验证
Flask-WTF是集成WTForms,并带有 csrf 令牌的安全表单和全局的 csrf 保护的功能。
每次我们在建立表单所创建的类都是继承与flask_wtf中的FlaskForm,而FlaskForm是继承WTForms中forms。使用Flask-WTF表单扩展,可以帮助进行CSRF验证,帮助我们快速定义表单模板,而且可以帮助我们在视图中验证表的数据
1、常用WTForms的验证函数
验证函数 | 说明 |
---|---|
DataRequired | 确保字段中有数据 |
EqualTo | 比较两个字段的值,常用于比较两次密码输入 |
Length | 验证输入的字符串长度 |
NumberRange | 验证输入的值在数字范围内 |
URL | 验证URL |
AnyOf | 验证输入值在可选列表中 |
NoneOf | 验证输入值不在可选列表中 |
注意:使用Flask-WTF需要配置参数SECRET_KEY。
CSRF_ENABLED是为了CSRF(跨站请求伪造)保护。 SECRET_KEY用来生成加密令牌,当CSRF激活的时候,该设置会根据设置的密匙生成加密令牌。
2、WTForms的HTML支持字段
字段对象 | 说明 |
---|---|
StringField | 文本字段 |
StringField | 文本字段 |
TextAreaField | 多行文本字段 |
PasswordField | 密码文本字段 |
HiddenField | 隐藏文本字段 |
DateField | 文本字段,值为datetime.date格式 |
DateTimeField | 文本字段,值为datetime.datetime格式 |
IntegerField | 文本字段,值为整数 |
DecimalField | 文本字段,值为decimal.Decimal |
FloatField | 文本字段,值为浮点数 |
BooleanField | 复选框,值为True和False |
RadioField | 一组单选框 |
SelectField | 下拉列表 |
SelectMultipleField | 下拉列表,可选择多个值 |
FileField | 文本上传字段 |
SubmitField | 表单提交按钮 |
FormField | 把表单作为字段嵌入另一个表单 |
FieldList | 一组指定类型的字段 |
3、一个非WTF的表单验证的例子
我们创建一个demo_test.py,
from flask import Flask, render_template, request, flash, redirect, url_for
app = Flask(__name__)
@app.route('/')
def index():
return "haha"
@app.route('/demo1', methods=['get', 'post'])
def demo1():
if request.method == 'POST':
username = request.form.get("username", "")
password = request.form.get("password", "")
password2 = request.form.get("password2", "")
print(username)
return redirect(url_for('index'))
return render_template('login.html')
if __name__ == '__main__':
app.run(debug=True)
在templates内创建login.html,写一个表单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
<label>用户名</label><input type="text" name="username">
<label>密码</label><input type="password" name="password">
<label>确认密码</label><input type="password" name="password2">
<input type="submit" value="注册">
</form>
</body>
</html>
启动服务后我们随意输入,点击注册即可跳转显示“haha”
4、一个WTF的表单验证的例子
利用WTF表单验证时需要大致三项
1.创建的基础表单(继承FlaskForm)
2.验证CSRF保护
3.视图函数验证表单
下面我们以一个示例做解释,首先创建一个wtf_demo.py
我们先调用一些库,其中flash的主要功能是渲染消息通知,由于不需要编写前后端通道即可渲染消息,可以称为消息闪现。
from flask import Flask, request, render_template, flash
app = Flask(__name__)
app.secret_key = 'adasfsads'
if __name__ == '__main__':
app.run(port=5001, debug=True)
在wtf_demo内创建一个基础表单,其中validators
字段的作用是调用WTF的验证函数,所需的所有验证函数应依次存于后继的列表内部。render_kw
字段主要用于填充html,这样就不必在前端书写。
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, EqualTo
class RegisterForm(FlaskForm):
username = StringField("用户名:", validators=[DataRequired("请输入用户名")], render_kw={"placeholder": "请输入用户名"})
password = PasswordField("密码", validators=[DataRequired("请输入密码")])
password2 = PasswordField("确认密码", validators=[DataRequired("请输入确认密码"), EqualTo("password", "两次密码不一致")])
submit = SubmitField("注册")
继而我们先编写一个视图函数来处理这些信息
@app.route('/', methods=["get", "post"])
def demo2():
register_form = RegisterForm()
if register_form.validate_on_submit():
# 如果代码走到if里面证明表单验证有效
username = request.form.get("username")
password = request.form.get("password", "")
password2 = request.form.get("password2", "")
print(username, password, password2)
return "success"
else:
if request.method == 'POST':
flash("表单参数有误或者不完整")
return render_template("wtf.html", form=register_form)
创建一个wtf.html,利用WTF进行表单验证时,我们不必按照基础的表单验证一样填充页面,而是采用字段渲染的方式。我们在<form></form>
内部添加{{ form.csrf_token }}
,而添加csrf_token
的方式绝非该处一种,其余的方法根据需要可自行搜索。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
{{ form.username.label }}{{ form.username }}<br>
{{ form.password.label }}{{ form.password }}<br>
{{ form.password2.label }}{{ form.password2 }}<br>
{{ form.submit }}<br>
{{ form.csrf_token }}
</form>
{# 调取消息并显示 #}
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}
</body>
</html>