web-dev-qa-db-ja.com

Flaskを使用したWTFormからのメール検証

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

ドキュメントを確認しましたが、十分に詳しく調べていない可能性がありますが、メール検証の例を見つけることができません。

16
lost9123193

これを試して:

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()])
28
Mehdi Sadeghi

復習と同じチュートリアルを行いました(flaskを数年間見ていない)。

問題は、バージョン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")
_

StringFieldTextFieldを置き換え、InputRequired優先されるDataRequiredであることに注意してください。名前空間全体をインポートするよりも、バリデーターを直接インポートする方が個人的な好みでした。これも機能します:_from wtforms import *_およびフォームクラス:name = StringField("Name", [validators.InputRequired("message")

Flask-WTFの最新バージョンへの更新中に、ビューでvalidate_on_submit()を使用することもできます( ここで推奨 )。

そして、便利なvalidate_on_submitは、それがPOSTリクエストであるかどうか、およびそれが有効であるかどうかをチェックします。

5
cstrutton
  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()])
      password = PasswordField('Password', validators=[DataRequired(), Email()])
      remember_me = BooleanField('Remember me')
      submit = SubmitField('Sign In')
1
J11
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 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がコードで指摘したように、フィールドの2番目の引数としてバリデーターのリストを直接指定します。この場合、メールフィールドは次のようになります。

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

from foo import bar接頭辞を削除したときにも気づいたように、validators.という構文を使用して必要なものだけをインポートすると、モジュールの名前空間が破棄されることに注意してください。一部のユーザーは、この名前空間を残してドット表記を使用する方がよいと考えています。名前の衝突を防ぎ、オブジェクトがどのモジュールに属しているかをすぐに確認するためです(インポートステートメントを確認する必要はありません)。

いつものように、選択はあなた次第です!

1
Timusan