当前位置:   article > 正文

使用 Flask 和 WTForms 构建一个用户注册表单

使用 Flask 和 WTForms 构建一个用户注册表单

在这篇技术博客中,我们将使用 Flask 和 WTForms 库来构建一个用户注册表单。我们将创建一个简单的 Flask 应用,并使用 WTForms 定义一个注册表单,包括用户名、密码、确认密码、邮箱、性别、城市和爱好等字段。我们还将为表单添加验证规则,以确保用户输入的数据符合要求。

1. 安装 Flask 和 WTForms

首先,确保已经安装了 Flask 和 WTForms。如果没有安装,可以使用以下命令进行安装:

  1. pip install Flask
  2. pip install WTForms

2. 创建 Flask 应用

创建一个名为 app.py 的文件,并在其中编写以下代码:

  1. from flask import Flask, render_template, request, redirect
  2. from wtforms import Form
  3. from wtforms.fields import core, simple, html5
  4. from wtforms import validators
  5. from wtforms import widgets
  6. app = Flask(__name__, template_folder='templates')
  7. app.debug = True

3. 定义注册表

接下来,我们将定义一个名为 RegisterForm 的表单类,该类继承自 wtforms.Form。在这个类中,我们将定义各种字段和验证规则。

  1. from flask import Flask, render_template, request, redirect
  2. from wtforms import Form
  3. from wtforms.fields import core, simple, html5
  4. from wtforms import validators
  5. from wtforms import widgets
  6. app = Flask(__name__, template_folder='templates')
  7. app.debug = True
  8. class RegisterForm(Form):
  9. name = simple.StringField(
  10. label='用户名',
  11. validators=[
  12. validators.DataRequired()
  13. ],
  14. widget=widgets.TextInput(),
  15. render_kw={'class': 'form-control'},
  16. default='GuHanZhe' # 页面输入框默认值
  17. )
  18. pwd = simple.PasswordField(
  19. label='密码',
  20. validators=[
  21. validators.DataRequired(message='密码不能为空')
  22. ],
  23. widget=widgets.PasswordInput(),
  24. render_kw={'class': 'form-control'}
  25. )
  26. pwd_confirm = simple.PasswordField(
  27. label='确认密码',
  28. validators=[
  29. validators.DataRequired(message='确认密码不能为空'),
  30. validators.EqualTo('pwd', message='两次密码输入不一致') # EqualTo作用是比较当前字段和指定字段名的字段值是否相等
  31. ],
  32. widget=widgets.PasswordInput(),
  33. render_kw={'class': 'form-control'}
  34. )
  35. email = html5.EmailField(
  36. label='邮箱',
  37. validators=[
  38. validators.DataRequired(message='邮箱不能为空'),
  39. validators.Email(message='邮箱格式有误')
  40. ],
  41. widget=widgets.TextInput(input_type='email'),
  42. render_kw={'class': 'form-control'}
  43. )
  44. gender = core.RadioField(
  45. label='性别',
  46. choices=(
  47. (1, '男'),
  48. (2, '女'),
  49. ),
  50. coerce=int
  51. )
  52. city = core.SelectField(
  53. label='城市',
  54. choices=(
  55. ('bj', '北京'),
  56. ('sh', '上海')
  57. )
  58. )
  59. hobby = core.SelectMultipleField(
  60. label='爱好',
  61. choices=(
  62. (1, '篮球'),
  63. (2, '足球')
  64. ),
  65. coerce=int
  66. )
  67. favor = core.SelectMultipleField(
  68. label='爱好',
  69. choices=(
  70. (1, '篮球'),
  71. (2, '足球')
  72. ),
  73. widget=widgets.ListWidget(prefix_label=False),
  74. option_widget=widgets.CheckboxInput(),
  75. coerce=int,
  76. default=[1, 2]
  77. )
  78. def __int__(self, *args, **kwargs):
  79. super(RegisterForm, self).__init__(*args, **kwargs)
  80. self.favor.choices = ((1, '篮球'), (2, '足球'), (3, '羽毛球'))
  81. def validate_pwd_confirm(self, field):
  82. """
  83. 自定义pwd_confirm字段规则,例:与pwd字段是否一致
  84. """
  85. # 最开始初始化时,self.data中已有所有值
  86. if field.data != self.data['pwd']:
  87. # raise validators.ValidationError('密码不一致') # 继续后续字段的验证
  88. raise validators.StopValidation('密码不一致') # 不再继续后续字段的验证
  89. @app.route('/register', methods=['GET', 'POST'])
  90. def register():
  91. if request.method == 'GET':
  92. form = RegisterForm(data={'gender': 1})
  93. return render_template('register.html', form=form)
  94. form = RegisterForm(formdata=request.form)
  95. if form.validate():
  96. print('用户提交数据通过格式验证,提交的值为:', form.data)
  97. else:
  98. print(form.errors)
  99. return render_template('register.html', form=form)
  100. if __name__ == '__main__':
  101. app.run()

4. 编写注册路由

现在,我们需要编写一个注册路由,该路由将处理用户的注册请求。当用户访问 /register 时,我们将渲染注册表单。当用户提交表单时,我们将验证表单数据,并在验证通过后打印提交的数据。

  1. @app.route('/register', methods=['GET', 'POST'])
  2. def register():
  3. if request.method == 'GET':
  4. form = RegisterForm(data={'gender': 1})
  5. return render_template('register.html', form=form)
  6. form = RegisterForm(formdata=request.form)
  7. if form.validate():
  8. print('用户提交数据通过格式验证,提交的值为:', form.data)
  9. else:
  10. print(form.errors)
  11. return render_template('register.html', form=form)

5. 创建注册表单模板

最后,我们需要创建一个名为 register.html 的模板文件,该文件将包含注册表单的 HTML 代码。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>注册表单</title>
  7. </head>
  8. <body>
  9. <h1>用户注册</h1>
  10. <form action="/register" method="post">
  11. <!-- ... 省略表单字段 ... -->
  12. <input type="submit" value="提交">
  13. </form>
  14. </body>
  15. </html>

6. 运行 Flask 应用

最后,我们需要在 app.py 文件中添加以下代码来运行 Flask 应用:

  1. if __name__ == '__main__':
  2. app.run()

现在,你可以运行 app.py 文件,并在浏览器中访问 http://127.0.0.1:5000/register 来查看注册表单。当用户提交表单时,你将在控制台中看到提交的数据和验证结果。

这就是使用 Flask 和 WTForms 构建一个用户注册表单的过程。你可以根据自己的需求对表单进行进一步的定制和扩展。

civilpy:Python数据分析及可视化实例目录944 赞同 · 36 评论文章​编辑

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/509583
推荐阅读
相关标签
  

闽ICP备14008679号