使用Flask的WTForm进行邮箱验证

26 投票
7 回答
65597 浏览
提问于 2025-04-18 17:23

我正在跟着一个关于Flask的教程,地址是 http://code.tutsplus.com/tutorials/intro-to-flask-adding-a-contact-page--net-28982,现在卡在了验证这一步。

旧版本的代码是这样的:

from flask.ext.wtf import Form, TextField, TextAreaField, SubmitField, validators, ValidationError

class ContactForm(Form):
name = TextField("Name",  [validators.Required("Please enter your name.")])
email = TextField("Email",  [validators.Required("Please enter your email address."), validators.Email("Please enter your email address.")])
submit = SubmitField("Send")

看了评论后,我把它更新成了这样:(把validators.Required换成了InputRequired)

(same fields)  

class ContactForm(Form):  
name = TextField("Name", validators=[InputRequired('Please enter your name.')])
email = EmailField("Email",  validators=[InputRequired("Please enter your email address.")]), validators.Email("Please enter your email address.")])
submit = SubmitField("Send")

我唯一的问题是我不知道该怎么处理validators.Email。出现的错误信息是:

NameError: name 'validators' is not defined

我查阅了文档,也许我没有深入研究,但我找不到关于邮箱验证的例子。

7 个回答

3

只需要用pip来安装一个叫做email_validator的工具,比如这样:

pip install email_validator

3
  from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, BooleanField, SubmitField 
  from wtforms.fields.html5 import EmailField 
  from wtforms.validators import DataRequired, Email

  class LoginForm(FlaskForm):
      username = StringField('Username', validators=[DataRequired()])
      email = EmailField('Email Address', validators=[DataRequired(), Email()])
      password = PasswordField('Password', validators=[DataRequired()])
      remember_me = BooleanField('Remember me')
      submit = SubmitField('Sign In')

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

4
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired, Email

class ContactForm(FlaskForm):  
    name = StringField("Name", validators=[DataRequired()])
    email = StringField("Email",  validators=[DataRequired(), Email()])
    submit = SubmitField("Send")

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

8

我最近又看了一遍之前的教程,因为我有好几年没碰过Flask了。

出现的问题是因为Flask-WTF在0.9版本时做了一些改变。在这里,他们提到:

注意:从0.9.0版本开始,Flask-WTF不再从wtforms导入任何东西,你需要自己从wtforms导入字段。

要直接导入,forms.py文件应该这样写:

from flask.ext.wtf import Form
from wtforms import StringField, TextAreaField, SubmitField
from wtforms.validators import InputRequired, Email

class ContactForm(Form):
  name = StringField("Name",  [InputRequired("Please enter your name.")])
  email = StringField("Email",  [InputRequired("Please enter your email address."), Email("This field requires a valid email address")])
  subject = StringField("Subject",  [InputRequired("Please enter a subject.")])
  message = TextAreaField("Message",  [InputRequired("Not including a message would be stupid")])
  submit = SubmitField("Send")

注意,StringField替代了TextField,而InputRequired DataRequired更受欢迎。个人偏好是直接导入验证器,而不是导入整个命名空间。你也可以这样写:from wtforms import *,然后在表单类中:name = StringField("Name", [validators.InputRequired("message")

在你更新到最新版本的Flask-WTF时,最好在你的视图中也使用validate_on_submit()这里推荐这样做)。

而且方便的validate_on_submit会检查请求是否是POST,并且验证是否有效。

40

试试这个:

from flask.ext.wtf import Form
from wtforms import validators
from wtforms.fields.html5 import EmailField

class ContactForm(Form):
    email = EmailField('Email address', [validators.DataRequired(), validators.Email()])

撰写回答