用户注册

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(),
validators.Regexp(regex="[a-zA-Z]",
message='密码至少8个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符')
# 正则中不要使用\w,\d等通配符。要用[a-zA-z0-9]
],
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="两次密码输入不一致")
],
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
)
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 = 从数据库再次查询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': 1})
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() app.py

渲染页面的两种方式

方式一:

 <p>{{form.name.label}} {{form.name}} {{form.name.errors[0] }}</p>

    <!--<input type="password" name="pwd">-->
<p>{{form.pwd.label}} {{form.pwd}} {{form.pwd.errors[0] }}</p> 方式二:
{% for item in form %}
<p>{{item.label}}: {{item}} {{item.errors[0] }}</p>
{% endfor %}

最新文章

  1. SQL、Linq、lamda表达式 同一功能不同写法
  2. 强大好用的&quot;文本&quot;编辑器
  3. java web项目导入到eclipse中变成了java项目的一种情况的解决办法
  4. ie下如果已经有缓存,load方法的效果就无法执行.的解决方法
  5. 如何让WordPress支持上传更多文件类型
  6. 清爽绿色格调图文box通用样式
  7. linux包之diff
  8. Linux添加快捷启动方式 (Ubuntu Debian CentOS)
  9. Nginx的事件处理机制
  10. SecureCRT、FileZilla使用Public证书登录Linux
  11. German Collegiate Programming Contest 2013:B
  12. HTML5 文件域+FileReader 分段读取文件并上传(八)-WebSocket
  13. 拿到手机ip住址
  14. Windows平台内核级文件访问
  15. codefirst初尝试
  16. 《C++ Primer Plus》学习笔记6
  17. ios的自动转屏
  18. C++雾中风景1:友元类与面向对象
  19. [HDU3247]Resource Archiver
  20. 在SOUI中使用动态多语言切换

热门文章

  1. JavaScript里面向对象的继承:不使用构造函数实现&quot;继承&quot;
  2. Centos下输入法全角半角转换
  3. 读取Properties配置文件, 四种方式都可以得到webroot/WEB-INF/classes这个路径
  4. Win7如何开启管理员账户
  5. [转载]linux 更新yum源 改成阿里云源
  6. Python Socket API 笔记
  7. python exec和eval
  8. js canvas画柱状图 没什么高端的 就是一篇偶尔思路的
  9. Centos 7 安装 Mysql5.7(压缩包方式)
  10. RabbitMQ Performance Testing Tool 性能测试工具