表单是web应用中最基础的组件之一,flask-form组件由Flask-WTF扩展提供支持。
具体的学习内容详见:
> https://blog.youkuaiyun.com/yy19890521/article/details/81120962
myapp/forms.py
创建RegisterForm,LoginForm,AddtodoForm,EdittodoForm等表格,带有验证功能,各种格式的验证。
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, ValidationError,SelectField,DateTimeField
from wtforms.validators import DataRequired, Email, Length, EqualTo
# 注册表单
from myapp.models import User,Category
class RegisterForm(FlaskForm):
email = StringField(
label="邮箱",
validators=[
DataRequired(),
Email(),
],
render_kw = {'placeholder': u'输入EMAIL地址'}
)
username = StringField(
label="用户名",
validators=[
DataRequired(),
],
)
password = PasswordField(
label='密码',
validators=[
DataRequired(),
Length(6, 12, "密码必须是6-12位")
]
)
repassword = PasswordField(
label='确认密码',
validators=[
EqualTo("password", "密码与确认密码不一致")
]
)
submit = SubmitField(
label="注册"
)
# *****************************************************
# 默认情况下validate_username会验证用户名是否正确, 验证的规则, 写在函数里面
def validate_username(self, field):
# filed.data ==== username表单提交的内容
u = User.query.filter_by(username=field.data).first()
if u:
raise ValidationError("用户名%s已经注册" % (u.username))
def validate_email(self, filed):
u = User.query.filter_by(email=filed.data).first()
if u:
raise ValidationError("邮箱%s已经注册" % (u.email))
# 登录表单
class LoginForm(FlaskForm):
username = StringField(
label="用户名",
validators=[
DataRequired(),
],
)
password = PasswordField(
label='密码',
validators=[
DataRequired(),
# Length(6, 12, "密码必须是6-12位")
]
)
submit = SubmitField(
label="登录"
)
class AddToDoForm(FlaskForm):
content=StringField(
label='任务内容',
validators=[DataRequired()]
)
category=SelectField(
label='任务类型',
coerce=int,
choices=[(item.id,item.name) for item in Category.query.all()]
)
submit=SubmitField(
label='添加任务',
)
# 关于任务的基类
class TodoForm(FlaskForm):
content = StringField(
label="任务内容",
validators=[
DataRequired()
]
)
# 任务类型
category = SelectField(
label="任务类型",
coerce=int,
choices=[(item.id, item.name) for item in Category.query.all()]
)
class AddTodoForm(TodoForm):
finish_time = DateTimeField(
label="任务终止日期"
)
submit = SubmitField(
label="添加任务",
)
class EditTodoForm(TodoForm):
submit = SubmitField(
label="编辑任务",
)
模板myapp/templates/baselogin.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
.base_login{
float: none;
display: block;
margin-left: auto;
margin-right:auto;
width: 200px;
}
</style>
<title>BaseLogin</title>
</head>
<body>
<div class="base_login">
<h1>用户登录</h1>
<div>
<form method="POST">
<!--启动CSRF,config.py中配置了密码-->
{{form.hidden_tag()}}
<p>
用户:{{form.name(size=20,id='username')}}
{%for e in form.username.errors%}
<span style="color: red">*{{e}}</span>
{%endfor%}
</p>
<p>
密码:{{form.password(size=20,id='password')}}
{%for e in form.password.errors%}
<span style="color: red">*{{e}}</span>
{%endfor%}
</p>
<p><button style="float: right" type="submit">登录</button></p>
</form>
</div>
</div>
</body>
</html>
myapp/views.py新增以下代码:
from flask import url_for
#导入定义的BaseLogin
from app.forms import BaseLogin
#定义处理函数和路由规则,接收GET和POST请求
@app.route('/baselogin',methods=('POST','GET'))
def baselogin():
form=BaseLogin()
#判断是否是验证提交
if form.validate_on_submit():
#跳转
flash(form.name.data+'|'+form.password.data)
return redirect(url_for('success'))
else:
#渲染
return render_template('baselogin.html',form=form)
@app.route('/success')
def success():
return '<h1>Success</h1>