【问题标题】:Email Validation from WTForm using Flask使用 Flask 从 WTForm 进行电子邮件验证
【发布时间】:2014-10-09 01:16:24
【问题描述】:

我正在学习 http://code.tutsplus.com/tutorials/intro-to-flask-adding-a-contact-page--net-28982 的 Flask 教程,目前卡在验证步骤中:

旧版本有以下内容:

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")

阅读 cmets 我将其更新为:(将验证器替换为 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

我查看了文档,也许我没有深入研究,但我似乎找不到电子邮件验证的示例。

【问题讨论】:

    标签: python validation email flask-wtforms


    【解决方案1】:

    试试这个:

    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()])
    

    【讨论】:

    • "请注意,这使用了一个非常原始的正则表达式,并且只应在您以后通过其他方式验证的情况下使用,例如电子邮件激活或查找。" - WTForms Validators documentation
    【解决方案2】:

    我完成了与复习相同的教程(我已经有几年没看过烧瓶了)。

    问题是由于 Flask-WTF 在 0.9 版中的更改。 Here,他们说:

    注意:从 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 替换 TextFieldInputRequired is preferred over DataRequired。直接导入验证器而不是导入整个命名空间是个人偏好。这也有效:from wtforms import * 和表单类:name = StringField("Name", [validators.InputRequired("message")

    当您更新到最新版本的 Flask-WTF 时,您也可以在视图中使用 validate_on_submit() (as recommended here)。

    并且方便的 validate_on_submit 会检查它是否是一个 POST 请求以及它是否有效。

    【讨论】:

      【解决方案3】:
      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")
      

      【讨论】:

        【解决方案4】:
          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')
        

        【讨论】:

          【解决方案5】:

          此错误的原因是您很可能使用from foo import bar import 语句导入了没有命名空间的验证器。

          为了使其更具可读性并修复示例代码中的语法错误:

          from flask.ext.wtf import Form
          from wtforms import TextField, SubmitField
          from wtforms.validators import InputRequired, Email
          from wtforms.fields.html5 import EmailField  
          
          class ContactForm(Form):  
              name = TextField("Name", validators=[InputRequired('Please enter your name.')])
              email = EmailField("Email",  validators=[InputRequired("Please enter your email address."), Email("Please enter your email address.")])
              submit = SubmitField("Send")
          

          这只会加载到 TextFieldSubmitFieldEmail 字段以及 InputRequiredEmail 验证器中。然后只需将验证器链接到您的 validators 关键字参数中,您就可以开始了。或者,正如@Mehdi Sadeghi 在代码中指出的那样,直接提供验证器列表作为该字段的第二个参数,在这种情况下,您的电子邮件字段将如下所示:

          email = EmailField("Email", [InputRequired("Please enter your email address."), Email("Please enter your email address.")])
          

          请注意,通过使用语法 from foo import bar 仅导入您需要的内容,您将丢弃模块命名空间,正如您在删除 validators. 前缀时也注意到的那样。有些人发现离开这个命名空间更好,因此使用点表示法,只是为了防止可能的名称冲突并立即查看对象属于哪个模块(无需回顾导入语句)。

          一如既往,选择权在您手中!

          【讨论】:

            【解决方案6】:

            只需使用 pip 安装 email_validator 例如

            pip install email_validator

            【讨论】:

            • 为什么一定要用email_validator。你可以不使用它来执行
            • 对于那些得到“NameError: name 'validators' is not defined”的人,一种解决方案是安装一个“email_validator”并保持他们的代码原样,而另一种解决方案是重新编码。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-05-11
            • 2017-11-19
            • 2011-01-31
            • 2014-03-05
            • 1970-01-01
            相关资源
            最近更新 更多