flask 框架(其五)表单操作与表单CSRF阻止

1,flask对表单的操作
  1),首先生成表单字段验证的类!类里面包含各种表单字段!表单字段是是通过类来生成的
  2),然后通过类里面传参来指定调用各个方法,实现特定的功能!
from flask import Flask, render_template
# 导入 wtf 扩展实现的表单的基类
from flask_wtf import FlaskForm
# 导入wtf扩展的各个表单的字段,并且制定对应的值操作!
from wtforms import StringField, PasswordField, SubmitField
# 导入wtf扩展实现的函数来进行字段的认证!
# DataRequired 确保字段中有数据,比较两个字段的值,常用于比较两次密码输入
from wtforms.validators import DataRequired, EqualTo

app = Flask(__name__)
# CSRF_ENABLED是为了CSRF(跨站请求伪造)保护 SECRET_KEY用来生成加密令牌,当CSRF激活的时候,该设置会根据设置的密匙生成加密令牌
app.config['SECRET_KEY'] = 'whd6cL+KBr9fXGNygCfJkVDXx0bRCQGVbc+n4Aasq0g='

# 自定义表单类
class From(FlaskForm):
    # validators 是指的是验证器!
    name = StringField(validators=[DataRequired()])
    password = PasswordField(validators=[DataRequired(), EqualTo('pws2')])
    pws2 = PasswordField(validators=[DataRequired()])
    submit = SubmitField(label='注册')

@app.route('/', methods=['GET', 'POST'])
def index():
    form = From()
    # form.validate_on_submit方法会首先调用验证函数是否执行,
    # 其次会验证表单域中是否设置csrf_token
    print(form.validate_on_submit())
    if form.validate_on_submit():
        name = form.name.data
        pwd = form.password.data
        ped2 = form.pws2.data
        print('保存信息到数据库!')
        print(name, pwd, ped2)
    return render_template('验证.html', form=form)

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

在html 模板之中使用

<form method="post">
{#  设置是为了放置跨域伪造请求!  #}
    {{ form.csrf_token }}
    <p>用户:{{ form.name }}</p>
    <p>密码:{{ form.password }}</p>
    <p>确认密码:{{ form.pws2 }}</p>
    <p>注册:{{ form.submit }}</p>
</form>

 2,CSRF 跨站请求伪造。

    防止跨站请求伪造:

'''
在客户端向后端请求界面数据的时候,后端会往响应中的 cookie 中设置 csrf_token 的值
在 Form 表单中添加一个隐藏的的字段,值也是 csrf_token
在用户点击提交的时候,会带上这两个值向后台发起请求
后端接受到请求,以会以下几件事件:
  从 cookie中取出 csrf_token
  从 表单数据中取出来隐藏的 csrf_token 的值 进行对比
如果比较之后两值一样,那么代表是正常的请求,如果没取到或者比较不一样,代表不是正常的请求,不执行下一步操作
'''

 

posted @ 2018-05-20 13:21  十七楼的羊  阅读(224)  评论(0编辑  收藏  举报