web-dev-qa-db-fra.com

Validation d'email de WTForm en utilisant Flask

Je suis un didacticiel Flask de http://code.tutsplus.com/tutorials/intro-to-flask-adding-a-contact-page--net-28982 et je suis actuellement bloqué sur l'étape de validation. :

L'ancienne version avait les caractéristiques suivantes:

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

En lisant les commentaires, je l'ai mis à jour comme suit: (remplacé validators.Required with 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")

Mon seul problème est que je ne sais pas quoi faire avec les validateurs.Email. Le message d'erreur que je reçois est le suivant:

NameError: name 'validators' is not defined

J'ai parcouru la documentation, peut-être que je n'ai pas approfondi suffisamment mais je n'arrive pas à trouver un exemple de validation de courrier électronique. 

13
lost9123193

Essaye ça:

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

J'ai suivi le même tutoriel que le recyclage (je n'avais pas regardé la fiole depuis quelques années). 

Le problème est dû à une modification de Flask-WTF à la version 0.9. Ici , ils disent:

Remarque: à partir de la version 0.9.0, Flask-WTF n'importera plus rien de Wtforms, vous devez importer des champs à partir de wtforms.

Pour importer directement, forms.py devrait se lire:

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

Notez que StringField remplace TextField et que InputRequiredest préféré àDataRequired. La préférence personnelle était d’importer les validateurs directement par rapport à l’espace de noms entier. Cela fonctionne aussi: from wtforms import * et dans la classe de formulaire: name = StringField("Name", [validators.InputRequired("message")

Pendant votre mise à jour vers la dernière version de Flask-WTF, vous pouvez également utiliser validate_on_submit() à votre vue ( comme recommandé ici ).

Et la commodité validate_on_submit vérifiera s’il s’agit d’une demande POST Et si elle est valide.

3
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')
0
Justin

La raison de cette erreur est que vous avez probablement importé les validateurs sans espace de nom, à l’aide des instructions from foo import bar import.

Pour le rendre un peu plus lisible et pour corriger les erreurs de syntaxe dans votre exemple de code:

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

Cela ne charge que dans les champs TextField, SubmitField et Email ainsi que seulement les validateurs InputRequired et Email. Ensuite, enchaînez simplement les validateurs dans votre argument de mot clé validators et vous pourrez continuer. Ou, comme @Mehdi Sadeghi l'a souligné dans le code, fournissez directement une liste de validateurs comme deuxième argument du champ, auquel cas votre champ de courrier électronique ressemblerait à ceci:

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

Notez qu'en important uniquement ce dont vous avez besoin à l'aide de la syntaxe from foo import bar, vous jetez l'espace de noms des modules, comme vous l'avez également remarqué lorsque vous avez supprimé le préfixe validators.. Certains trouvent préférable de quitter cet espace de noms et utilisent donc la notation point, simplement pour éviter les conflits de noms et voir immédiatement à quel module appartient un objet (sans avoir à regarder en arrière les instructions import).

Comme toujours, le choix vous appartient! 

0
Timusan