目录
wtforms
使用1(简单版):
使用2(复杂版):
wtforms
安装:pip3 install wtforms
使用1(简单版):
from flask import Flask, render_template, request, redirect from wtforms import Form from wtforms.fields import simple from wtforms import validators from wtforms import widgets app = Flask(__name__, template_folder=\'templates\') app.debug = True class LoginForm(Form): # 字段(内部包含正则表达式) name = simple.StringField( label=\'用户名\', validators=[ validators.DataRequired(message=\'用户名不能为空.\'), validators.Length(min=6, max=18, message=\'用户名长度必须大于%(min)d且小于%(max)d\') ], widget=widgets.TextInput(), # 页面上显示的插件 render_kw={\'class\': \'form-control\'} ) # 字段(内部包含正则表达式) pwd = simple.PasswordField( label=\'密码\', validators=[ validators.DataRequired(message=\'密码不能为空.\'), validators.Length(min=8, message=\'用户名长度必须大于%(min)d\'), validators.Regexp(regex=\"^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[$@$!%*?&])[A-Za-z\\d$@$!%*?&]{8,}\", message=\'密码至少8个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符\') ], widget=widgets.PasswordInput(), render_kw={\'class\': \'form-control\'} ) @app.route(\'/login\', methods=[\'GET\', \'POST\']) def login(): if request.method == \'GET\': form = LoginForm() return render_template(\'login.html\', form=form) else: form = LoginForm(formdata=request.form) if form.validate(): print(\'用户提交数据通过格式验证,提交的值为:\', form.data) else: print(form.errors) return render_template(\'login.html\', form=form) if __name__ == \'__main__\': app.run()
login.html
<!DOCTYPE html> <html lang=\"en\"> <head> <meta charset=\"UTF-8\"> <title>Title</title> </head> <body> <h1>登录</h1> <form method=\"post\"> <p>{{form.name.label}} {{form.name}} {{form.name.errors[0] }}</p> <p>{{form.pwd.label}} {{form.pwd}} {{form.pwd.errors[0] }}</p> <input type=\"submit\" value=\"提交\"> </form> </body> </html>
使用2(复杂版):
from flask import Flask, render_template, request, redirect from wtforms import Form from wtforms.fields import core from wtforms.fields import html5 from wtforms.fields import simple from wtforms import validators from wtforms import widgets app = Flask(__name__, template_folder=\'templates\') app.debug = True class RegisterForm(Form): name = simple.StringField( label=\'用户名\', validators=[ validators.DataRequired() ], widget=widgets.TextInput(), render_kw={\'class\': \'form-control\'}, default=\'alex\' ) pwd = simple.PasswordField( label=\'密码\', validators=[ validators.DataRequired(message=\'密码不能为空.\') ], widget=widgets.PasswordInput(), render_kw={\'class\': \'form-control\'} ) pwd_confirm = simple.PasswordField( label=\'重复密码\', validators=[ validators.DataRequired(message=\'重复密码不能为空.\'), validators.EqualTo(\'pwd\', message=\"两次密码输入不一致\") # EqualTo也可以做密码验证 ], widget=widgets.PasswordInput(), render_kw={\'class\': \'form-control\'} ) email = html5.EmailField( label=\'邮箱\', validators=[ validators.DataRequired(message=\'邮箱不能为空.\'), validators.Email(message=\'邮箱格式错误\') ], widget=widgets.TextInput(input_type=\'email\'), render_kw={\'class\': \'form-control\'} ) gender = core.RadioField( label=\'性别\', choices=( (1, \'男\'), (2, \'女\'), ), coerce=int # “1” “2” ) city = core.SelectField( label=\'城市\', choices=( (\'bj\', \'北京\'), (\'sh\', \'上海\'), ) ) hobby = core.SelectMultipleField( label=\'爱好\', choices=( (1, \'篮球\'), (2, \'足球\'), ), coerce=int ) favor = core.SelectMultipleField( label=\'喜好\', choices=( (1, \'篮球\'), (2, \'足球\'), ), widget=widgets.ListWidget(prefix_label=False), option_widget=widgets.CheckboxInput(), coerce=int, default=[1, 2] ) def __init__(self, *args, **kwargs): super(RegisterForm, self).__init__(*args, **kwargs) self.favor.choices = ((1, \'篮球\'), (2, \'足球\'), (3, \'羽毛球\')) def validate_pwd_confirm(self, field): \"\"\" 自定义pwd_confirm字段规则,例:与pwd字段是否一致 :param field: :return: \"\"\" # 最开始初始化时,self.data中已经有所有的值 if field.data != self.data[\'pwd\']: # raise validators.ValidationError(\"密码不一致\") # 继续后续验证 raise validators.StopValidation(\"密码不一致\") # 不再继续后续验证 @app.route(\'/register\', methods=[\'GET\', \'POST\']) def register(): if request.method == \'GET\': form = RegisterForm(data={\'gender\': 2,\'hobby\':[1,]}) # initial return render_template(\'register.html\', form=form) else: form = RegisterForm(formdata=request.form) if form.validate(): print(\'用户提交数据通过格式验证,提交的值为:\', form.data) else: print(form.errors) return render_template(\'register.html\', form=form) if __name__ == \'__main__\': app.run()
register.html
<!DOCTYPE html> <html lang=\"en\"> <head> <meta charset=\"UTF-8\"> <title>Title</title> </head> <body> <h1>用户注册</h1> <form method=\"post\" novalidate style=\"padding:0 50px\"> {% for field in form %} <p>{{field.label}}: {{field}} {{field.errors[0] }}</p> {% endfor %} <input type=\"submit\" value=\"提交\"> </form> </body> </html>
© 版权声明
THE END
暂无评论内容