美文网首页
2020-06-02--flask04--flask基础04

2020-06-02--flask04--flask基础04

作者: program_white | 来源:发表于2020-06-09 21:28 被阅读0次
  • jinja2模板
  • 表单验证
  • WTF表单验证

jinjia2语法

过滤器

jinja2的过滤器与django中的过滤器很相似
用法:

{{ 变量|过滤器 参数 }}
对于字符串的过滤器:
  • 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>
  • trim:把值的首尾空格去掉;
<p>{{ ' hello world ' | trim }}</p>
  • reverse:字符串反转;
<p>{{ 'olleh' | reverse }}</p>
  • format:格式化输出;
<p>{{ '%s is %d' | format('name',17) }}</p>
  • striptags:渲染之前把值中所有的HTML标签都删掉;
<p>{{ '<em>hello</em>' | striptags }}</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>
数值过滤器
<h2>数值过滤器</h2>

<p>{{ 1.5|round }}</p>         {# 四舍五入,返回float #}

<p>{{ 12.8888 | round(2, 'floor') }}</p>     {# 保留两位小数,向下取 #}

<p>{{ -2|abs }}</p>           {# 绝对值 #}

自定义过滤器

我们自定义过滤器依旧可以采用装饰器的方式进行定义,也可以通过app内注册的方式实现它,如果没有给过滤器名称,则过滤器默认同样为函数名。

#自定义过滤器
#1.
@app.template_filter('absp')         #装饰器的参数为自定义的过滤器名称
def abspuls(num):
    num = abs(num)
    num+=1
    return num

#2.
def abspuls(num):
    num = abs(num)
    num += 1
    return num
app.add_template_filter(abspuls,'absp')        #第一个参数为函数名,第二个参数为自定义的过滤器名
<p>{{ -2|absp }}</p>        {# 使用自定义的过滤器 #}

Web表单

web表单是web应用程序的基本功能。

它是HTML页面中负责数据采集的部件。表单有三个部分组成:表单标签、表单域、表单按钮。表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器。
在django中,有forms模块帮助我们验证表单,
在Flask中,为了处理web表单,我们一般使用Flask-WTF扩展,它封装了WTForms,并且它有验证表单数据的功能

WTF表单验证

Flask-WTF是集成WTForms,并带有 csrf 令牌的安全表单和全局的 csrf 保护的功能。
每次我们在建立表单所创建的类都是继承与flask_wtf中的FlaskForm,而FlaskForm是继承WTForms中forms。使用Flask-WTF表单扩展,可以帮助进行CSRF验证,帮助我们快速定义表单模板,而且可以帮助我们在视图中验证表的数据。

常用WTForms的验证函数:

验证函数 说明
DataRequired 确保字段中有数据
EqualTo 比较两个字段的值,常用于比较两次密码输入
Length 验证输入的字符串长度
NumberRange 验证输入的值在数字范围内
URL 验证URL
AnyOf 验证输入值在可选列表中
NoneOf 验证输入值不在可选列表中

form表单的action属性默认提交给当前地址栏的url

不使用WTF表单验证

app.secret_key = 'defwefwfwef'

@app.route('/login',methods=['GET','POST'])
def login():
    if request.method == 'POST':
        #获取表单的参数
        uname = request.form.get('username','')
        pwd = request.form.get('password','')
        pwd2 = request.form.get('password2','')
        if not all([uname,pwd,pwd2]):
            flash('参数不足')        #向前端展示一个参数
        elif pwd != pwd2:
            flash('密码不一致')
        else:
            print(uname,pwd,pwd2)
            return "success"
        # return redirect(url_for('tranfer'))
    return render_template('login.html')

html:

<body>
<h1>登录页面</h1>
<form action="" method="POST">
    <label for="uname">username:</label>
    <input type="text" name="username" id="uname" placeholder="请输入用户名">
    <br><br>
    <label for="text">password:</label>
    <input type="text" name="password" id="text" placeholder="请输入密码">
    <br><br>
    <label for="text">pwdagain:</label>
    <input type="text" name="password2" id="text" placeholder="确认密码">
    <br><br>
    <input type="submit" value="登录">
</form>

#用于显示flash值
{% for message in get_flashed_messages() %}
    {{ message }}
{% endfor %}

运行:
访问:127.0.0.1:5000/login


使用WTF表单验证

新建一个demo_wtf2.py:

from flask import Flask, request, render_template, flash

app = Flask(__name__)

app.secret_key = 'adasfsads'

if __name__ == '__main__':
    app.run(debug=True)

flash的主要功能是渲染消息通知,由于不需要编写前后端通道即可渲染消息,可以称为消息闪现。
在demo_wtf2内创建一个基础表单,其中validators字段的作用是调用WTF的验证函数,所需的所有验证函数应依次存于后继的列表内部。render_kw字段主要用于填充html,这样就不必在前端书写。

RegisterForm类:

#自定义表单类
class RegisterForm(FlaskForm):
    username = StringField("用户名:",validators=[DataRequired("请输入用户名:")],render_kw={"placeholder":"请输入用户名"})
    password = PasswordField("密码",validators=[DataRequired ("请输入密码")],render_kw={"placeholder":"请输入密码"})
    password2 = PasswordField("确认密码",validators=[DataRequired ("请确认密码"),EqualTo('password','密码不一致')],render_kw={"placeholder":"请确认密码"})
    submit = SubmitField("登录")

视图函数:

@app.route('/login2',methods=['GET','POST'])
def login2():
    # 实例化表单类
    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('login2.html',form = register_form)

html:

<body>
<h1>WTF表单</h1>
<form method="post">
    {{ form.username.laebel }}{{ form.username }}<br>
    {{ form.password.laebel }}{{ form.password }}<br>
    {{ form.password2.laebel }}{{ form.password2 }}<br>
    {{ form.submit }}
</form>

#flash信息
{% for message in get_flashed_messages() %}
    {{ message }}
{% endfor %}
</body>

分析:当使用get方式访问login2页面时,获取表单验证中的信息,表单验证不合法并且不是post请求,直接返回携带表单信息的login2.html页面。
当用户填写了表单信息后,使用post提交给服务器,在表单验证类中验证如果合法,获取各个信息值,返回success,如果不合法,进入else,并且方法为post,就返回flash的值。
运行:127.0.0.1:5000/login2


填写正确的情况:

返回success

错误的情况:

闪现flash的值:

app.config['WTF_CSRF_ENABLED'] = False
关闭csrf的验证

代码:
demo_wtf.py:

from flask import Flask, render_template, request, flash

from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,SubmitField             #字符串,密码,提交按钮 字段
from wtforms.validators import DataRequired, EqualTo       # 保证字段中有数据,是否一致

app = Flask(__name__)


#自定义表单类
class RegisterForm(FlaskForm):
    username = StringField("用户名:",validators=[DataRequired("请输入用户名:")],render_kw={"placeholder":"请输入用户名"})
    password = PasswordField("密码",validators=[DataRequired ("请输入密码")],render_kw={"placeholder":"请输入密码"})
    password2 = PasswordField("确认密码",validators=[DataRequired ("请确认密码"),EqualTo('password','密码不一致')],render_kw={"placeholder":"请确认密码"})
    submit = SubmitField("登录")

app.secret_key = 'defwefwfwef'

app.config['WTF_CSRF_ENABLED'] = False       #关闭csrf的验证

@app.route('/login2',methods=['GET','POST'])
def login2():
    # 实例化表单类
    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('login2.html',form = register_form)

if __name__ == '__main__':
    app.run(debug=True)

相关文章

网友评论

      本文标题:2020-06-02--flask04--flask基础04

      本文链接:https://www.haomeiwen.com/subject/cqypzhtx.html