0x003-表单的应用

概述

在flask中,通常使用flask-wtf来创建一个表单对象,并在表单对象中,对其中的字段进行验证。

准备工作

安装flask-wtf

1
pip install flask-wtf

设置SECRET_KEY

1
2
3
4
5
6
7
8
9
10
11
12
13
app.config['SECRET_KEY'] = 'xxxxx'
新建config.py

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import os
class Config(object):
SECRET_KEY = '02cc16ca-a181-4fe5-bf7e-3e7820fb9bfb'
...

最后使用
app.config.from_object(Config)

使用flask-wtf创建对象

创建表单对象

  1. render_kw 用于渲染html属性
  2. validate_xxxfield 用于验证xxx字段
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class LoginForm(FlaskForm):
username = StringField('Username',validators=[DataRequired()],render_kw={
"class":"form-control",
"id":"inputEmail3",
"placeholder":"Username"
})
...
submit = SubmitField("Submit")


class RegisterForm(FlaskForm):
username = StringField("请输入用户名:",validators = [DataRequired(),Length(1,16,message='用户名不能超过16个字符'),Regexp(r'[a-zA-Z0-9\u4e00-\u9fa5]',message='只接受字母数字和中文')])
password = PasswordField("请输入密码:",validators = [DataRequired()])
password2 = PasswordField("重新输入密码:",validators=[DataRequired(),EqualTo("password",message="两次输入的密码必须要相同")])
email = StringField("请输入邮箱:",validators = [DataRequired(),Email(message='邮箱格式有误。')])
des = TextAreaField("自我介绍:",validators=[DataRequired()])
submit = SubmitField("提交")

def validate_username(self,username):
user = User.query.filter_by(username=username.data).first()
if user:
raise ValidationError('error')

def validate_email(self,email):
email = User.query.filter_by(email = email.data).first()
if email:
raise ValidationError("error")

模板应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<form class="form-horizontal" method="POST">

{{ form.hidden_tag() }}

<div class="form-group">
{{ form.username.label(class_="col-sm-2 control-label")}}

<div class="col-sm-10">

{{ form.username() }}
{% for error in form.username.errors %}
<span style="color:red">{{ error }}</span>
{% endfor %}

</div>
</div>
...
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
{{ form.submit(class_='class="btn btn-default"')}}
</div>
</div>
</form>

视图函数

1
2
3
4
5
6
7
@auth.route('/login',methods=['GET','POST'])
def login():
...
form=LoginForm()
if form.validate_on_submit():
...
return render_template('auth/login.html',title='login',form=form)