簡體   English   中英

使用 Flask 從 WTForm 驗證電子郵件

[英]Email Validation from WTForm using Flask

我正在關注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")

閱讀評論我將其更新為:(用 InputRequired 替換了validators.Required)

(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

我查看了文檔,也許我沒有深入研究,但似乎找不到電子郵件驗證的示例。

嘗試這個:

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 版中 Flask-WTF 發生了變化。 在這里,他們說:

注意:從 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 請求以及它是否有效。

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

此錯誤的原因是您很可能使用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的語法僅導入您需要的內容from foo import bar您將丟棄模塊名稱空間,正如您在刪除validators.時也注意到的那樣validators. 字首。 有些人發現離開這個命名空間更好,因此使用點符號,只是為了防止可能的名稱沖突並立即查看對象屬於哪個模塊(無需回顧導入語句)。

一如既往,選擇權在您!

只需使用 pip 安裝 email_validator 例如

pip 安裝 email_validator

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM