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 的值 进行对比 如果比较之后两值一样,那么代表是正常的请求,如果没取到或者比较不一样,代表不是正常的请求,不执行下一步操作 '''