flask表单类Flask-WTF(flask学习)

  • baagee 发布于 2017-02-24 20:59:01
  • 分类:Python
  • 2366 人围观
  • 0 人喜欢

默认情况下,Flask-WTF 能保护所有表单免受跨站请求伪造(Cross-Site Request Forgery, CSRF)的攻击。恶意网站把请求发送到被攻击者已登录的其他网站时就会引发 CSRF 攻击。

为了实现 CSRF 保护,Flask-WTF 需要程序设置一个密钥。Flask-WTF 使用这个密钥生成 加密令牌,再用令牌验证请求中表单数据的真伪。设置密钥的方法如下

app = Flask(__name__) 
app.config['SECRET_KEY'] = 'sdkfgmokeryh094375t9uoer'

使用 Flask-WTF 时,每个 Web 表单都由一个继承自 Form 的类表示。这个类定义表单中的 一组字段,每个字段都用对象表示。字段对象可附属一个或多个验证函数。验证函数用来 验证用户提交的输入值是否符合要求。

示例 是一个简单的 Web 表单

class loginForm(FlaskForm):
    username = StringField('用户名', validators=[DataRequired(message='用户名不能为空')])
    password = PasswordField('密码', validators=[DataRequired(message='密码不能为空')])
    submit = SubmitField('立即登陆')

这个表单中的字段都定义为类变量,类变量的值是相应字段类型的对象。在这个示例中, loginForm 表单中有一个名为 username 的文本字段和一个名为password的密码字段还有一个 submit 的提交按钮。StringField 类表示属性为 type="text" 的 <input> 元素。PasswordField

 类表示属性为 type="password" 的 <input> 元素

,SubmitField 类表示属性为 type="submit" 的 <input> 元素。字段构造函数的第一个参数是把表单渲染成 HTML 时使用的label。

StringField 构造函数中的可选参数 validators 指定一个由验证函数组成的列表,在接受用户提交的数据之前验证数据。验证函数 DataRequired

() 确保提交的字段不为空。

WTForms支持的HTML标准字段

WTForms验证函数

其中Required已经改为DataRequired

接下来就是渲染html了,视图函数把一个 loginForm 实例通过参数 form 传入模板:

@app.route('/login', methods=['GET', 'POST'])
def login():
    form=loginForm()
    if form.validate_on_submit() and request.method=='POST':
        user=User(form.username.data,form.password.data)
        if user.checkUser():
            session['user']=form.username.data
            return redirect(url_for('index'))
        else:
            flash('用户名或者密码错误')
    return render_template('login.html',form=form,title='登录')

在模板中可以生成一个简单的表单,可以为字段指定 id 或 class 属性,然后定 义 CSS 样式。如下所示

<form action="" method="POST">

<dl class="admin_login">
 <dt>
  <strong>站点后台管理系统</strong>
  <em>Management System</em>
 </dt>

 <dd class="user_icon">
{{ form.csrf_token }}
     {{ form.username(class='login_txtbx') }}
 </dd>
 <dd class="pwd_icon">
     {{ form.password(class="login_txtbx") }}
 </dd>

 <dd style="height: auto">
  <div style="text-align: center;color: red;">
  {% for message in get_flashed_messages() %}
      {{ message }}
   {% endfor %}
      {% if form.errors %}
    {% for error in form.errors %}
      {{ form.errors[error][0] }}<br>
    {% endfor %}
  {% endif %}
  </div>
 </dd>
 <dd>
     {{ form.submit(class='submit_btn') }}
 </dd>
 <dd>
 </dd>
</dl>
</form>

一定不要忘记加入{{ form.csrf_token }}不然表单不能提交


标签: python falsk

评论

点击图片切换
还没有评论,快来抢沙发吧!