使用Flas从WTForm发送电子邮件验证

2024-05-03 04:11:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习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")

阅读注释时,我将其更新为:(用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

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


Tags: nameformflaskyouraddressemailclasstextfield
3条回答

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

要使其更具可读性并修复示例代码中的语法错误,请执行以下操作:

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.前缀时注意到的那样。有些人发现,最好离开这个名称空间,然后使用点表示法,这样做只是为了防止可能的名称冲突,并立即查看对象所属的模块(无需回顾import语句)。

一如既往,选择权在你!

试试这个:

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

我复习了同样的教程(我已经好几年没看烧瓶了)。

问题是由于0.9版本的烧瓶WTF发生了变化。Here他们说:

Note: From version 0.9.0, Flask-WTF will not import anything from wtforms, you need to import fields from 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,并且InputRequiredis preferred overDataRequired。直接导入验证器是个人偏好,而不是导入整个命名空间。这也适用于:from wtforms import *和表单类:name = StringField("Name", [validators.InputRequired("message")

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

And the convenience validate_on_submit will check if it is a POST request and if it is valid.

相关问题 更多 >