Проверка электронной почты с помощью 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") 

Читая комментарии, я обновил его до следующего: (заменил валидаторы. Требуется 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") 

Моя единственная проблема – я не знаю, что делать с валидаторами. Email. Сообщение об ошибке, которое я получаю:

 NameError: name 'validators' is not defined 

Я просмотрел документацию, возможно, я недостаточно глубоко разбираюсь, но я не могу найти пример для проверки подлинности электронной почты.

3 Solutions collect form web for “Проверка электронной почты с помощью WTForm с использованием фляжки”

Попробуй это:

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

Я проработал тот же учебник, что и переподготовка (я пару лет не смотрел на колбу).

Проблема связана с изменением в Flask-WTF версии 0.9. Здесь они говорят:

Примечание. Начиная с версии 0.9.0, Flask-WTF ничего не импортирует из wtforms, вам нужно импортировать поля из wtforms.

Чтобы импортировать напрямую, form.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 foo import bar помощью операторов импорта from foo import bar импорта from foo import bar .

Чтобы сделать его более читаемым и исправить ошибки синтаксиса в вашем примере кода:

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

Это загружает только поля TextField , SubmitField и Email а также только валидаторы InputRequired и Email . Затем просто соедините validators аргументом ключевого слова validators, и вам хорошо идти. Или, как указал @Mehdi Sadeghi в коде, напрямую поставляйте список валидаторов в качестве второго аргумента в поле, и в этом случае ваше поле электронной почты будет выглядеть так:

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

Обратите внимание, что импортируя только то, что вам нужно, используя синтаксис from foo import bar вы выбрасываете пространство имен модулей, как вы также заметили, когда вы сбросили validators. префикс. Некоторые считают, что лучше оставить это пространство имен и, таким образом, использовать точечную нотацию, просто чтобы предотвратить возможные столкновения имен и сразу увидеть, к какому модулю принадлежит объект (без необходимости оглядываться на операторы импорта).

Выбор, как всегда, ваш!

 
Interesting Posts for Van-Lav

AttributeError: модуль 'xgboost' не имеет атрибута 'XGBRegressor'

Вход в pygame для Mac OS X отправляется в Terminal вместо Python

Как использовать панды для поиска последовательных одинаковых данных во временных рядах

Правильные выражения Python имеют эквивалент атомной группировки Ruby?

как выполнить скрипт Python 3.3 в консоли Spyder с переменными?

Печать Python 3 без круглых скобок

Ошибка дескриптора файла

Python SSLError: ошибка на стороне клиента (EOF произошел с нарушением протокола), ошибка на стороне сервера (SSL3_GET_RECORD: неправильный номер версии)

Выберите несколько полей с одной группой в django

Проблемы с компоновкой Python 2.5.2 и Solaris 8 (gcc 3.4.2)

Как использовать аутентифицированный прокси-сервер в селеном хромированном ривере?

Включить функциональность администратора Django во внешнем интерфейсе с помощью встроенных

Google App Engine (DataStore) Связанный Entitydeletion

Django: статический файл не найден

Использование новых допущений SymPy

Python - лучший язык программирования в мире.